Skip to content

Knowledge Base

grisun0 edited this page Oct 7, 2026 · 40 revisions

Polyglot Codebase Knowledge Graph

Generated offline by readmenator. 105 files, 1852 symbols, 788 imports. Supports C, C++, Python, Go, Rust, JS/TS, Java, C#, Shell, PHP, Dart, GDScript, Nim, ASM, Ruby, Swift, Kotlin, Scala, Lua, Elixir. No LLMs. No tokens. Pure static analysis. See more here

Start here: Statistics Dashboard for scope, God Nodes for blast radius, Architecture Reference for per-file API. Agents: prefer readmenator-agent/INDEX.md + SYMBOLS.md.

Wiki: prefer readmenator-wiki/index.md for progressive disclosure: one synthesis page per community, connections.json with EXTRACTED vs INFERRED confidence, queries.md log, REPORT.md audit.

Confidence: EXTRACTED = parsed from source, INFERRED = heuristic bridge, AMBIGUOUS = reported, never hidden. See readmenator-wiki/REPORT.md.

Total Files Parsed: 105 | Total Symbols Extracted: 1852 | Total Imports: 788 | Resolved Imports: 348

Table of Contents

  1. Statistics Dashboard
  2. Architectural Layers
  3. Ranked Context
  4. God Nodes
  5. Community Analysis
  6. Surprising Connections
  7. Suggested Questions
  8. Taint Propagation Map
  9. Hotspot Analysis
  10. Change Impact Analysis
  11. Suggested Linting Rules
  12. Orphans
  13. Query Recipes
  14. Structural Knowledge Map
  15. UML Class Diagram
  16. Code Property Graph
  17. Architecture Reference

Statistics Dashboard

Metric Value
Total Files 105
Total Symbols 1852
Total Imports 788
Call Edges 11251
Inheritance Edges 130
Languages 1
Avg Symbols/File 17.6
Avg Imports/File 7.5
Resolved Imports 348

Top Files by Import Count (Fan-Out)

File Imports Symbols Language
test_diagrams.py 30 69 py
_pipeline.py 27 34 py
test_agent_output.py 27 45 py
_video.py 26 49 py
test_parsers_property.py 26 27 py
__init__.py 23 2 py
_app.py 22 50 py
test_agent_friendliness.py 20 43 py
_agent_output.py 16 32 py
_wiki.py 16 31 py

Architectural Layers

Auto-detected from path patterns, naming conventions, and imported frameworks.

Layer Files
utility 57
testing 39
infrastructure 4
business_logic 3
data_access 2

utility

  • readmenator.py (py, 0 symbols)
  • __init__.py (py, 0 symbols)
  • __main__.py (py, 3 symbols)
  • _agent_output.py (py, 32 symbols)
  • _analyzer.py (py, 18 symbols)
  • _app.py (py, 50 symbols)
  • _category.py (py, 26 symbols)
  • _cpg.py (py, 6 symbols)
  • _cursorrules_generator.py (py, 8 symbols)
  • _dead_code.py (py, 5 symbols)
  • _diagrams.py (py, 79 symbols)
  • _documentation.py (py, 28 symbols)
  • _explain.py (py, 3 symbols)
  • _exporter.py (py, 15 symbols)
  • _gh_wiki.py (py, 18 symbols)
  • ... and 42 more

infrastructure

  • _agent_injector.py (py, 14 symbols)
  • _cache.py (py, 14 symbols)
  • _config.py (py, 1 symbols)
  • _readme_injector.py (py, 8 symbols)

data_access

  • _dataflow.py (py, 21 symbols)
  • _query.py (py, 17 symbols)

business_logic

  • _layer_rules.py (py, 4 symbols)
  • _models.py (py, 20 symbols)
  • _rule_gen.py (py, 9 symbols)

testing

  • __init__.py (py, 0 symbols)
  • test_agent_friendliness.py (py, 43 symbols)
  • test_agent_injector.py (py, 38 symbols)
  • test_agent_output.py (py, 45 symbols)
  • test_analyzer.py (py, 14 symbols)
  • test_cache.py (py, 22 symbols)
  • test_config.py (py, 6 symbols)
  • test_cpg.py (py, 11 symbols)
  • test_cursorrules.py (py, 12 symbols)
  • test_dataflow.py (py, 47 symbols)
  • test_dead_code.py (py, 15 symbols)
  • test_diagrams.py (py, 69 symbols)
  • test_documentation.py (py, 29 symbols)
  • test_exporter.py (py, 15 symbols)
  • test_gh_wiki.py (py, 15 symbols)
  • ... and 24 more

Ranked Context

Files ranked by composite score for the current query context. The ranking combines Personalized PageRank (query relevance), global authority, test coverage, documentation coverage, and code freshness. Model: v1.0.

Rank File Composite PPR Authority Test Doc
1 _config.py 0.2747 0.1127 0.1199 0.00 2.00
2 _models.py 0.2129 0.1656 0.1672 0.00 1.05
3 _category.py 0.1567 0.1649 0.1626 0.00 0.50
4 _c.py 0.1343 0.0000 0.0045 0.00 1.33
5 _gitmeta.py 0.1298 0.0074 0.0076 0.00 1.25
6 _base.py 0.1249 0.0002 0.0409 0.00 1.17
7 _layers.py 0.1233 0.0157 0.0096 0.00 1.14
8 _agent_output.py 0.1230 0.0420 0.0047 0.00 1.03
9 _rule_gen.py 0.1222 0.0470 0.0053 0.00 1.00
10 _watcher.py 0.1210 0.0001 0.0047 0.00 1.20

Query anchors: tests/test_documentation.py, tests/test_linter.py, readmenator/_documentation.py, tests/test_ranking.py, readmenator/_rule_gen.py, tests/test_agent_friendliness.py, tests/test_agent_output.py, readmenator/_diagrams.py (+3 more)

Top result justification paths:

test_documentation.py -> _config.py test_documentation.py -> _documentation.py -> _config.py


God Nodes

Most architecturally central files ranked by combined import/export degree and symbol richness.

File Score Connections PageRank
_models.py 160.0 0.1672
_config.py 122.1 0.1199
_pipeline.py 55.4 0.0000
_app.py 53.0 0.0000
__init__.py 48.2 0.0000
_base.py 44.6 0.0409
test_parsers_property.py 42.7 0.0000
test_agent_friendliness.py 28.3 0.0000
_agent_output.py 23.2 0.0047
_diagrams.py 21.9 0.0000

Community Analysis

Files grouped by import-based community detection. Cohesion measures how tightly connected each community is internally.

readmenator: _diagrams (Cohesion: 0.55)

50 files in this community:

  • readmenator.py (py, 0 symbols)
  • __init__.py (py, 0 symbols)
  • __main__.py (py, 3 symbols)
  • _analyzer.py (py, 18 symbols)
  • _app.py (py, 50 symbols)
  • _config.py (py, 1 symbols)
  • _cpg.py (py, 6 symbols)
  • _cursorrules_generator.py (py, 8 symbols)
  • _dataflow.py (py, 21 symbols)
  • _dead_code.py (py, 5 symbols)
  • _diagrams.py (py, 79 symbols)
  • _exporter.py (py, 15 symbols)
  • _hotspots.py (py, 7 symbols)
  • _layer_rules.py (py, 4 symbols)
  • _layers.py (py, 7 symbols)
  • _linter.py (py, 7 symbols)
  • _mcp_server.py (py, 52 symbols)
  • _pipeline.py (py, 34 symbols)
  • _query.py (py, 17 symbols)
  • _readme_injector.py (py, 8 symbols)
  • ... and 30 more files

tests: _agent_injector (Cohesion: 0.29)

3 files in this community:

  • _agent_injector.py (py, 14 symbols)
  • test_agent_injector.py (py, 38 symbols)
  • test_agent_output.py (py, 45 symbols)

readmenator: _agent_output (Cohesion: 0.35)

10 files in this community:

  • _agent_output.py (py, 32 symbols)
  • _cache.py (py, 14 symbols)
  • _gh_wiki.py (py, 18 symbols)
  • _gitmeta.py (py, 4 symbols)
  • _purpose.py (py, 7 symbols)
  • _resolver.py (py, 17 symbols)
  • test_agent_friendliness.py (py, 43 symbols)
  • test_cache.py (py, 22 symbols)
  • test_gh_wiki.py (py, 15 symbols)
  • test_resolver.py (py, 22 symbols)

readmenator: _category (Cohesion: 0.42)

5 files in this community:

  • _category.py (py, 26 symbols)
  • _explain.py (py, 3 symbols)
  • _projections.py (py, 15 symbols)
  • _rank.py (py, 17 symbols)
  • test_ranking.py (py, 72 symbols)

readmenator: _documentation (Cohesion: 0.23)

4 files in this community:

  • _documentation.py (py, 28 symbols)
  • _mermaid.py (py, 4 symbols)
  • test_documentation.py (py, 29 symbols)
  • test_mermaid.py (py, 11 symbols)

readmenator/parsers (Cohesion: 0.56)

26 files in this community:

  • _models.py (py, 20 symbols)
  • __init__.py (py, 2 symbols)
  • _assembly.py (py, 2 symbols)
  • _base.py (py, 6 symbols)
  • _c.py (py, 3 symbols)
  • _csharp.py (py, 2 symbols)
  • _dart.py (py, 2 symbols)
  • _elixir.py (py, 2 symbols)
  • _gdscript.py (py, 2 symbols)
  • _go.py (py, 2 symbols)
  • _java.py (py, 2 symbols)
  • _javascript.py (py, 2 symbols)
  • _kotlin.py (py, 2 symbols)
  • _lua.py (py, 2 symbols)
  • _nim.py (py, 2 symbols)
  • _php.py (py, 2 symbols)
  • _python.py (py, 2 symbols)
  • _ruby.py (py, 2 symbols)
  • _rust.py (py, 2 symbols)
  • _scala.py (py, 2 symbols)
  • ... and 6 more files

tests: _scanner (Cohesion: 0.21)

5 files in this community:

  • _scanner.py (py, 14 symbols)
  • _taint.py (py, 6 symbols)
  • test_scanner.py (py, 21 symbols)
  • test_taint.py (py, 10 symbols)
  • test_taint_bdd.py (py, 26 symbols)

Surprising Connections

Files in different communities connected through 3+ indirect hops.

  • readmenator.py <-> test_agent_injector.py (5 hops, across 2 communities)
  • test_agent_injector.py <-> test_resolver.py (5 hops, across 3 communities)
  • test_readme_injector.py <-> test_resolver.py (5 hops, across 2 communities)
  • __init__.py <-> test_agent_injector.py (4 hops, across 2 communities)
  • __main__.py <-> test_agent_injector.py (4 hops, across 2 communities)

Suggested Questions

Auto-generated exploration prompts based on graph structure:

  • What does _models.py depend on, and what depends on it? (79 connections)
  • What does _config.py depend on, and what depends on it? (61 connections)
  • What does _pipeline.py depend on, and what depends on it? (26 connections)
  • How are the 50 files in 'readmenator: _diagrams' related to each other?
  • Why are readmenator.py and test_agent_injector.py connected through 5 hops across 2 communities?

Taint Propagation Map

Taint analysis traces how dangerous imports propagate through the codebase via transitive dependencies. Source files import dangerous modules directly; sink files receive the danger indirectly.

Taint Sources: 6 | Taint Sinks: 14 | Propagation Paths: 20

  • _agent_injector.py imports subprocess (0 hop to _agent_injector.py) [high] Path: _agent_injector.py
  • _documentation.py imports subprocess (0 hop to _documentation.py) [high] Path: _documentation.py
  • _documentation.py imports subprocess (1 hop to _uml.py) [high] Path: _documentation.py -> _uml.py
  • _documentation.py imports subprocess (1 hop to _mermaid.py) [high] Path: _documentation.py -> _mermaid.py
  • _documentation.py imports subprocess (1 hop to _cpg.py) [high] Path: _documentation.py -> _cpg.py
  • _documentation.py imports subprocess (1 hop to _config.py) [high] Path: _documentation.py -> _config.py
  • _documentation.py imports subprocess (1 hop to _models.py) [high] Path: _documentation.py -> _models.py
  • _documentation.py imports subprocess (1 hop to _rank.py) [high] Path: _documentation.py -> _rank.py
  • _documentation.py imports subprocess (2 hops to _category.py) [high] Path: _documentation.py -> _models.py -> _category.py
  • _gh_wiki.py imports subprocess (0 hop to _gh_wiki.py) [high] Path: _gh_wiki.py
  • _gh_wiki.py imports subprocess (1 hop to _gitmeta.py) [high] Path: _gh_wiki.py -> _gitmeta.py
  • _gh_wiki.py imports subprocess (1 hop to _config.py) [high] Path: _gh_wiki.py -> _config.py
  • _video.py imports subprocess (0 hop to _video.py) [high] Path: _video.py
  • _video.py imports subprocess (1 hop to _models.py) [high] Path: _video.py -> _models.py
  • _video.py imports subprocess (1 hop to _config.py) [high] Path: _video.py -> _config.py
  • _video.py imports subprocess (2 hops to _category.py) [high] Path: _video.py -> _models.py -> _category.py
  • readmenator_orchestrator.py imports subprocess (0 hop to readmenator_orchestrator.py) [high] Path: readmenator_orchestrator.py
  • test_gh_wiki.py imports subprocess (0 hop to test_gh_wiki.py) [high] Path: test_gh_wiki.py
  • test_gh_wiki.py imports subprocess (1 hop to _config.py) [high] Path: test_gh_wiki.py -> _config.py
  • test_gh_wiki.py imports subprocess (1 hop to _gh_wiki.py) [high] Path: test_gh_wiki.py -> _gh_wiki.py

Hotspot Analysis

Files ranked by combined complexity (symbol count) and centrality (connection count). High-scoring files are architecturally critical and may need refactoring attention.

File Complexity Centrality Combined Symbols Connections
_config.py 0.011 0.667 0.405 1 64
_models.py 0.230 1.000 0.692 20 96
_category.py 0.299 0.125 0.195 26 12
_c.py 0.035 0.083 0.064 3 8
_gitmeta.py 0.046 0.062 0.056 4 6
_base.py 0.069 0.281 0.196 6 27
_layers.py 0.081 0.125 0.107 7 12
_agent_output.py 0.368 0.271 0.310 32 26
_rule_gen.py 0.103 0.125 0.116 9 12
_watcher.py 0.058 0.094 0.079 5 9
test_diagrams.py 0.793 0.375 0.542 69 36
_app.py 0.575 0.490 0.524 50 47
_pipeline.py 0.391 0.552 0.488 34 53
_diagrams.py 0.908 0.177 0.469 79 17
test_agent_output.py 0.517 0.385 0.438 45 37

Change Impact Analysis

Files sorted by how many other files would be affected if they changed. High-impact files should be changed with caution.

File Direct Dependents Transitive Dependents Total Impact
_category.py 8 50 81
_models.py 50 0 78
_config.py 50 0 61
_base.py 20 17 37
_c.py 2 16 18
_csharp.py 2 16 18
_dart.py 2 16 18
_elixir.py 2 16 18
_gdscript.py 2 16 18
_go.py 2 16 18
_java.py 2 16 18
_javascript.py 2 16 18
_kotlin.py 2 16 18
_lua.py 2 16 18
_nim.py 2 16 18

Suggested Linting Rules

Automatically suggested linting and security rules based on patterns detected in the codebase. These can be exported as Semgrep rules using the --export-rules flag.

Rule ID Severity Description Language Matches
RM001 info Large number of functions in py: 1622 total py 1622
RM002 info Print statement found (consider logging instead) python 16

Orphans

Files with no documentation or low connectivity. These are candidates for documentation investment or cleanup.

  • readmenator_orchestrator.py (34 symbols, no doc)
  • __init__.py (0 symbols, no doc)
  • test_agent_output.py (45 symbols, no doc)
  • test_config.py (6 symbols, no doc)
  • test_dataflow.py (47 symbols, no doc)
  • test_documentation.py (29 symbols, no doc)
  • test_integration.py (16 symbols, no doc)
  • test_mermaid.py (11 symbols, no doc)
  • test_models.py (11 symbols, no doc)
  • test_parsers.py (87 symbols, no doc)
  • test_query.py (18 symbols, no doc)
  • test_scanner.py (21 symbols, no doc)
  • test_wiki.py (30 symbols, no doc)

Query Recipes

Example queries you can run against this knowledge base using the ranking engine:

# Find files most relevant to a concept
readmenator query "Where is the import resolver implemented?"

# Rank files by relevance to a topic
readmenator query "How does documentation generation work?"

# Explain why a file ranks highly
readmenator query "explain readmenator/_documentation.py"

# Trace dependency paths with ranked context
readmenator query "path from CLI to exporter"

The ranking model uses the following signals:

  • Personalized PageRank (45% weight): query-specific relevance via seed propagation
  • Global Authority (20% weight): structural importance via standard PageRank
  • Test Coverage (15% weight): fraction of symbols referenced in test files
  • Doc Coverage (10% weight): presence of docstrings and file-level docs
  • Freshness (10% weight): recent modification activity

Results include score decomposition and justification paths for each ranked item.


Structural Knowledge Map

graph TD
    classDef mod fill:#1e1e1e,stroke:#ff6666,stroke-width:2px,color:#fff;
    classDef cls fill:#2d2d2d,stroke:#4ec9b0,stroke-width:2px,color:#fff;
    classDef fn fill:#333,stroke:#dcdcaa,stroke-width:1px,color:#dcdcaa;
    classDef ext fill:#111,stroke:#666,stroke-dasharray:5 5,color:#aaa;
    subgraph community_0 ["readmenator: _diagrams"]
    readmenator__pipeline_py["_pipeline.py (py)"]
    class readmenator__pipeline_py mod;
    readmenator__pipeline_py_AnalyzerFactory["AnalyzerFactory"]
    class readmenator__pipeline_py_AnalyzerFactory cls;
    readmenator__pipeline_py --> readmenator__pipeline_py_AnalyzerFactory
    readmenator__pipeline_py_DeepAnalysisRunner["DeepAnalysisRunner"]
    class readmenator__pipeline_py_DeepAnalysisRunner cls;
    readmenator__pipeline_py --> readmenator__pipeline_py_DeepAnalysisRunner
    readmenator__pipeline_py___init__["__init__"]
    class readmenator__pipeline_py___init__ fn;
    readmenator__pipeline_py --> readmenator__pipeline_py___init__
    readmenator__pipeline_py_scanner["scanner"]
    class readmenator__pipeline_py_scanner fn;
    readmenator__pipeline_py --> readmenator__pipeline_py_scanner
    readmenator__pipeline_py_generator["generator"]
    class readmenator__pipeline_py_generator fn;
    readmenator__pipeline_py --> readmenator__pipeline_py_generator
    end
    subgraph community_5 ["readmenator/parsers"]
    tests_test_parsers_property_py["test_parsers_property.py (py)"]
    class tests_test_parsers_property_py mod;
    readmenator_parsers___init___py["__init__.py (py)"]
    class readmenator_parsers___init___py mod;
    readmenator__app_py["_app.py (py)"]
    class readmenator__app_py mod;
    end
    subgraph community_1 ["tests: _agent_injector"]
    tests_test_agent_output_py["test_agent_output.py (py)"]
    class tests_test_agent_output_py mod;
    tests_test_diagrams_py["test_diagrams.py (py)"]
    class tests_test_diagrams_py mod;
    end
    subgraph community_2 ["readmenator: _agent_output"]
    tests_test_agent_friendliness_py["test_agent_friendliness.py (py)"]
    class tests_test_agent_friendliness_py mod;
    readmenator__video_py["_video.py (py)"]
    class readmenator__video_py mod;
    readmenator__agent_output_py["_agent_output.py (py)"]
    class readmenator__agent_output_py mod;
    readmenator__wiki_py["_wiki.py (py)"]
    class readmenator__wiki_py mod;
    tests_test_wiki_py["test_wiki.py (py)"]
    class tests_test_wiki_py mod;
    readmenator___init___py["__init__.py (py)"]
    class readmenator___init___py mod;
    readmenator__mcp_server_py["_mcp_server.py (py)"]
    class readmenator__mcp_server_py mod;
    end
    subgraph community_4 ["readmenator: _documentation"]
    tests_test_documentation_py["test_documentation.py (py)"]
    class tests_test_documentation_py mod;
    readmenator__documentation_py["_documentation.py (py)"]
    class readmenator__documentation_py mod;
    end
    subgraph community_6 ["tests: _scanner"]
    tests_test_taint_bdd_py["test_taint_bdd.py (py)"]
    class tests_test_taint_bdd_py mod;
    tests_test_refactorizer_py["test_refactorizer.py (py)"]
    class tests_test_refactorizer_py mod;
    readmenator_orchestrator_py["readmenator_orchestrator.py (py)"]
    class readmenator_orchestrator_py mod;
    readmenator__gh_wiki_py["_gh_wiki.py (py)"]
    class readmenator__gh_wiki_py mod;
    end
    subgraph community_3 ["readmenator: _category"]
    tests_test_ranking_py["test_ranking.py (py)"]
    class tests_test_ranking_py mod;
    tests_test_dataflow_py["test_dataflow.py (py)"]
    class tests_test_dataflow_py mod;
    tests_test_mcp_server_py["test_mcp_server.py (py)"]
    class tests_test_mcp_server_py mod;
    tests_test_scanner_py["test_scanner.py (py)"]
    class tests_test_scanner_py mod;
    readmenator__exporter_py["_exporter.py (py)"]
    class readmenator__exporter_py mod;
    readmenator___main___py["__main__.py (py)"]
    class readmenator___main___py mod;
    readmenator__diagrams_py["_diagrams.py (py)"]
    class readmenator__diagrams_py mod;
    tests_test_security_py["test_security.py (py)"]
    class tests_test_security_py mod;
    readmenator__scanner_py["_scanner.py (py)"]
    class readmenator__scanner_py mod;
    tests_test_video_py["test_video.py (py)"]
    class tests_test_video_py mod;
    tests_test_agent_injector_py["test_agent_injector.py (py)"]
    class tests_test_agent_injector_py mod;
    tests_test_readme_injector_py["test_readme_injector.py (py)"]
    class tests_test_readme_injector_py mod;
    tests_test_cache_py["test_cache.py (py)"]
    class tests_test_cache_py mod;
    readmenator__analyzer_py["_analyzer.py (py)"]
    class readmenator__analyzer_py mod;
    tests_test_gh_wiki_py["test_gh_wiki.py (py)"]
    class tests_test_gh_wiki_py mod;
    tests_test_analyzer_py["test_analyzer.py (py)"]
    class tests_test_analyzer_py mod;
    tests_test_cursorrules_py["test_cursorrules.py (py)"]
    class tests_test_cursorrules_py mod;
    tests_test_rule_gen_py["test_rule_gen.py (py)"]
    class tests_test_rule_gen_py mod;
    readmenator__rule_gen_py["_rule_gen.py (py)"]
    class readmenator__rule_gen_py mod;
    readmenator__security_py["_security.py (py)"]
    class readmenator__security_py mod;
    readmenator__query_py["_query.py (py)"]
    class readmenator__query_py mod;
    tests_test_exporter_py["test_exporter.py (py)"]
    class tests_test_exporter_py mod;
    tests_test_cpg_py["test_cpg.py (py)"]
    class tests_test_cpg_py mod;
    tests_test_sarif_py["test_sarif.py (py)"]
    class tests_test_sarif_py mod;
    readmenator__cursorrules_generator_py["_cursorrules_generator.py (py)"]
    class readmenator__cursorrules_generator_py mod;
    readmenator__linter_py["_linter.py (py)"]
    class readmenator__linter_py mod;
    tests_test_uml_py["test_uml.py (py)"]
    class tests_test_uml_py mod;
    readmenator__uml_py["_uml.py (py)"]
    class readmenator__uml_py mod;
    readmenator__dataflow_py["_dataflow.py (py)"]
    class readmenator__dataflow_py mod;
    tests_test_integration_py["test_integration.py (py)"]
    class tests_test_integration_py mod;
    tests_test_dead_code_py["test_dead_code.py (py)"]
    class tests_test_dead_code_py mod;
    readmenator__agent_injector_py["_agent_injector.py (py)"]
    class readmenator__agent_injector_py mod;
    readmenator__cache_py["_cache.py (py)"]
    class readmenator__cache_py mod;
    tests_test_linter_py["test_linter.py (py)"]
    class tests_test_linter_py mod;
    tests_test_layer_rules_py["test_layer_rules.py (py)"]
    class tests_test_layer_rules_py mod;
    tests_test_hotspots_py["test_hotspots.py (py)"]
    class tests_test_hotspots_py mod;
    tests_test_taint_py["test_taint.py (py)"]
    class tests_test_taint_py mod;
    readmenator__refactorizer_py["_refactorizer.py (py)"]
    class readmenator__refactorizer_py mod;
    readmenator__watcher_py["_watcher.py (py)"]
    class readmenator__watcher_py mod;
    readmenator__resolver_py["_resolver.py (py)"]
    class readmenator__resolver_py mod;
    readmenator__hotspots_py["_hotspots.py (py)"]
    class readmenator__hotspots_py mod;
    readmenator__taint_py["_taint.py (py)"]
    class readmenator__taint_py mod;
    readmenator_parsers__base_py["_base.py (py)"]
    class readmenator_parsers__base_py mod;
    readmenator__dead_code_py["_dead_code.py (py)"]
    class readmenator__dead_code_py mod;
    readmenator_parsers__python_py["_python.py (py)"]
    class readmenator_parsers__python_py mod;
    tests_test_parsers_py["test_parsers.py (py)"]
    class tests_test_parsers_py mod;
    tests_test_parsers_new_py["test_parsers_new.py (py)"]
    class tests_test_parsers_new_py mod;
    readmenator__rank_py["_rank.py (py)"]
    class readmenator__rank_py mod;
    readmenator__projections_py["_projections.py (py)"]
    class readmenator__projections_py mod;
    readmenator__layers_py["_layers.py (py)"]
    class readmenator__layers_py mod;
    readmenator__cpg_py["_cpg.py (py)"]
    class readmenator__cpg_py mod;
    readmenator__layer_rules_py["_layer_rules.py (py)"]
    class readmenator__layer_rules_py mod;
    readmenator__explain_py["_explain.py (py)"]
    class readmenator__explain_py mod;
    readmenator_parsers__c_py["_c.py (py)"]
    class readmenator_parsers__c_py mod;
    readmenator_parsers__assembly_py["_assembly.py (py)"]
    class readmenator_parsers__assembly_py mod;
    readmenator_parsers__csharp_py["_csharp.py (py)"]
    class readmenator_parsers__csharp_py mod;
    readmenator_parsers__dart_py["_dart.py (py)"]
    class readmenator_parsers__dart_py mod;
    readmenator_parsers__elixir_py["_elixir.py (py)"]
    class readmenator_parsers__elixir_py mod;
    readmenator_parsers__gdscript_py["_gdscript.py (py)"]
    class readmenator_parsers__gdscript_py mod;
    readmenator_parsers__go_py["_go.py (py)"]
    class readmenator_parsers__go_py mod;
    readmenator_parsers__java_py["_java.py (py)"]
    class readmenator_parsers__java_py mod;
    readmenator_parsers__javascript_py["_javascript.py (py)"]
    class readmenator_parsers__javascript_py mod;
    readmenator_parsers__kotlin_py["_kotlin.py (py)"]
    class readmenator_parsers__kotlin_py mod;
    readmenator_parsers__lua_py["_lua.py (py)"]
    class readmenator_parsers__lua_py mod;
    readmenator_parsers__nim_py["_nim.py (py)"]
    class readmenator_parsers__nim_py mod;
    readmenator_parsers__php_py["_php.py (py)"]
    class readmenator_parsers__php_py mod;
    readmenator_parsers__ruby_py["_ruby.py (py)"]
    class readmenator_parsers__ruby_py mod;
    readmenator_parsers__rust_py["_rust.py (py)"]
    class readmenator_parsers__rust_py mod;
    readmenator_parsers__scala_py["_scala.py (py)"]
    class readmenator_parsers__scala_py mod;
    readmenator_parsers__shell_py["_shell.py (py)"]
    class readmenator_parsers__shell_py mod;
    readmenator_parsers__swift_py["_swift.py (py)"]
    class readmenator_parsers__swift_py mod;
    readmenator__models_py["_models.py (py)"]
    class readmenator__models_py mod;
    tests_test_query_py["test_query.py (py)"]
    class tests_test_query_py mod;
    tests_test_mermaid_py["test_mermaid.py (py)"]
    class tests_test_mermaid_py mod;
    readmenator__purpose_py["_purpose.py (py)"]
    class readmenator__purpose_py mod;
    readmenator__sarif_py["_sarif.py (py)"]
    class readmenator__sarif_py mod;
    readmenator__mermaid_py["_mermaid.py (py)"]
    class readmenator__mermaid_py mod;
    readmenator__category_py["_category.py (py)"]
    class readmenator__category_py mod;
    tests_test_resolver_py["test_resolver.py (py)"]
    class tests_test_resolver_py mod;
    readmenator__readme_injector_py["_readme_injector.py (py)"]
    class readmenator__readme_injector_py mod;
    tests_test_config_py["test_config.py (py)"]
    class tests_test_config_py mod;
    readmenator_py["readmenator.py (py)"]
    class readmenator_py mod;
    tests_test_models_py["test_models.py (py)"]
    class tests_test_models_py mod;
    readmenator__gitmeta_py["_gitmeta.py (py)"]
    class readmenator__gitmeta_py mod;
    readmenator__config_py["_config.py (py)"]
    class readmenator__config_py mod;
    tests___init___py["__init__.py (py)"]
    class tests___init___py mod;
    end
    readmenator___init___py -- resolved_imports --> readmenator__app_py
    readmenator___init___py -- resolved_imports --> readmenator__category_py
    readmenator___init___py -- resolved_imports --> readmenator__config_py
    readmenator___init___py -- resolved_imports --> readmenator__diagrams_py
    readmenator___init___py -- resolved_imports --> readmenator__mcp_server_py
    readmenator___init___py -- resolved_imports --> readmenator__models_py
    readmenator___init___py -- resolved_imports --> readmenator__rank_py
    readmenator___init___py -- resolved_imports --> readmenator__readme_injector_py
    readmenator___init___py -- resolved_imports --> readmenator__uml_py
    readmenator___main___py -- resolved_imports --> readmenator__app_py
    readmenator___main___py -- resolved_imports --> readmenator__config_py
    readmenator___main___py -- resolved_imports --> readmenator__mcp_server_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__cache_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__config_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__gitmeta_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__models_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__purpose_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__resolver_py
    readmenator__agent_output_py -- resolved_imports --> readmenator__security_py
    readmenator__analyzer_py -- resolved_imports --> readmenator__config_py
    readmenator__analyzer_py -- resolved_imports --> readmenator__models_py
    readmenator__app_py -- resolved_imports --> readmenator__cache_py
    readmenator__app_py -- resolved_imports --> readmenator__config_py
    readmenator__app_py -- resolved_imports --> readmenator__cursorrules_generator_py
    readmenator__app_py -- resolved_imports --> readmenator__dead_code_py
    readmenator__app_py -- resolved_imports --> readmenator__diagrams_py
    readmenator__app_py -- resolved_imports --> readmenator__gh_wiki_py
    readmenator__app_py -- resolved_imports --> readmenator__layers_py
    readmenator__app_py -- resolved_imports --> readmenator__linter_py
    readmenator__app_py -- resolved_imports --> readmenator__models_py
    readmenator__app_py -- resolved_imports --> readmenator__pipeline_py
    readmenator__app_py -- resolved_imports --> readmenator__query_py
    readmenator__app_py -- resolved_imports --> readmenator__rank_py
    readmenator__app_py -- resolved_imports --> readmenator__refactorizer_py
    readmenator__app_py -- resolved_imports --> readmenator__resolver_py
    readmenator__app_py -- resolved_imports --> readmenator__watcher_py
    readmenator__app_py -- resolved_imports --> readmenator__video_py
    readmenator__cache_py -- resolved_imports --> readmenator__config_py
    readmenator__cpg_py -- resolved_imports --> readmenator__models_py
    readmenator__cursorrules_generator_py -- resolved_imports --> readmenator__config_py
    readmenator__cursorrules_generator_py -- resolved_imports --> readmenator__layers_py
    readmenator__cursorrules_generator_py -- resolved_imports --> readmenator__models_py
    readmenator__dataflow_py -- resolved_imports --> readmenator__config_py
    readmenator__dataflow_py -- resolved_imports --> readmenator__models_py
    readmenator__dead_code_py -- resolved_imports --> readmenator__config_py
    readmenator__dead_code_py -- resolved_imports --> readmenator__models_py
    readmenator__diagrams_py -- resolved_imports --> readmenator__config_py
    readmenator__diagrams_py -- resolved_imports --> readmenator__models_py
    readmenator__documentation_py -- resolved_imports --> readmenator__config_py
    readmenator__documentation_py -- resolved_imports --> readmenator__cpg_py
    readmenator__documentation_py -- resolved_imports --> readmenator__mermaid_py
    readmenator__documentation_py -- resolved_imports --> readmenator__uml_py
    readmenator__documentation_py -- resolved_imports --> readmenator__models_py
    readmenator__documentation_py -- resolved_imports --> readmenator__rank_py
    readmenator__explain_py -- resolved_imports --> readmenator__category_py
    readmenator__explain_py -- resolved_imports --> readmenator__rank_py
    readmenator__exporter_py -- resolved_imports --> readmenator__config_py
    readmenator__exporter_py -- resolved_imports --> readmenator__models_py
    readmenator__gh_wiki_py -- resolved_imports --> readmenator__config_py
    readmenator__gh_wiki_py -- resolved_imports --> readmenator__gitmeta_py
    readmenator__hotspots_py -- resolved_imports --> readmenator__config_py
    readmenator__hotspots_py -- resolved_imports --> readmenator__models_py
    readmenator__layer_rules_py -- resolved_imports --> readmenator__config_py
    readmenator__layer_rules_py -- resolved_imports --> readmenator__models_py
    readmenator__layers_py -- resolved_imports --> readmenator__models_py
    readmenator__linter_py -- resolved_imports --> readmenator__config_py
    readmenator__linter_py -- resolved_imports --> readmenator__layers_py
    readmenator__linter_py -- resolved_imports --> readmenator__models_py
    readmenator__mcp_server_py -- resolved_imports --> readmenator__app_py
    readmenator__mcp_server_py -- resolved_imports --> readmenator__config_py
    readmenator__mcp_server_py -- resolved_imports --> readmenator__layers_py
    readmenator__mcp_server_py -- resolved_imports --> readmenator__models_py
    readmenator__mcp_server_py -- resolved_imports --> readmenator__query_py
    readmenator__mermaid_py -- resolved_imports --> readmenator__models_py
    readmenator__models_py -- resolved_imports --> readmenator__category_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__agent_injector_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__agent_output_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__analyzer_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__category_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__config_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__cpg_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__dataflow_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__diagrams_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__documentation_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__exporter_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__gh_wiki_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__hotspots_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__layer_rules_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__layers_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__models_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__rank_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__readme_injector_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__rule_gen_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__sarif_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__scanner_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__security_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__taint_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__uml_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__video_py
    readmenator__pipeline_py -- resolved_imports --> readmenator__wiki_py
    ext_readmenator__app["readmenator._app"]
    class ext_readmenator__app ext;
    readmenator___init___py -.->|imports| ext_readmenator__app
    ext_readmenator__category["readmenator._category"]
    class ext_readmenator__category ext;
    readmenator___init___py -.->|imports| ext_readmenator__category
    ext_readmenator__config["readmenator._config"]
    class ext_readmenator__config ext;
    readmenator___init___py -.->|imports| ext_readmenator__config
    ext_readmenator__diagrams["readmenator._diagrams"]
    class ext_readmenator__diagrams ext;
    readmenator___init___py -.->|imports| ext_readmenator__diagrams
    ext_readmenator__mcp_server["readmenator._mcp_server"]
    class ext_readmenator__mcp_server ext;
    readmenator___init___py -.->|imports| ext_readmenator__mcp_server
    ext_readmenator__models["readmenator._models"]
    class ext_readmenator__models ext;
    readmenator___init___py -.->|imports| ext_readmenator__models
    ext_readmenator__rank["readmenator._rank"]
    class ext_readmenator__rank ext;
    readmenator___init___py -.->|imports| ext_readmenator__rank
    ext_readmenator__readme_injector["readmenator._readme_injector"]
    class ext_readmenator__readme_injector ext;
    readmenator___init___py -.->|imports| ext_readmenator__readme_injector
    ext_readmenator__uml["readmenator._uml"]
    class ext_readmenator__uml ext;
    readmenator___init___py -.->|imports| ext_readmenator__uml
    ext___future__["__future__"]
    class ext___future__ ext;
    readmenator___main___py -.->|imports| ext___future__
    ext_argparse["argparse"]
    class ext_argparse ext;
    readmenator___main___py -.->|imports| ext_argparse
    ext_logging["logging"]
    class ext_logging ext;
    readmenator___main___py -.->|imports| ext_logging
    ext_sys["sys"]
    class ext_sys ext;
    readmenator___main___py -.->|imports| ext_sys
    ext_unittest["unittest"]
    class ext_unittest ext;
    readmenator___main___py -.->|imports| ext_unittest
    ext_pathlib["pathlib"]
    class ext_pathlib ext;
    readmenator___main___py -.->|imports| ext_pathlib
    readmenator___main___py -.->|imports| ext_readmenator__app
    readmenator___main___py -.->|imports| ext_readmenator__config
    readmenator___main___py -.->|imports| ext_readmenator__mcp_server
    readmenator__agent_injector_py -.->|imports| ext___future__
    ext_glob["glob"]
    class ext_glob ext;
    readmenator__agent_injector_py -.->|imports| ext_glob
    ext_importlib_util["importlib.util"]
    class ext_importlib_util ext;
    readmenator__agent_injector_py -.->|imports| ext_importlib_util
    readmenator__agent_injector_py -.->|imports| ext_logging
    ext_subprocess["subprocess"]
    class ext_subprocess ext;
    readmenator__agent_injector_py -.->|imports| ext_subprocess
    readmenator__agent_injector_py -.->|imports| ext_sys
    readmenator__agent_injector_py -.->|imports| ext_pathlib
    ext_typing["typing"]
    class ext_typing ext;
    readmenator__agent_injector_py -.->|imports| ext_typing
    readmenator__agent_output_py -.->|imports| ext___future__
    ext_json["json"]
    class ext_json ext;
    readmenator__agent_output_py -.->|imports| ext_json
    readmenator__agent_output_py -.->|imports| ext_logging
    ext_os["os"]
    class ext_os ext;
    readmenator__agent_output_py -.->|imports| ext_os
    ext_re["re"]
    class ext_re ext;
    readmenator__agent_output_py -.->|imports| ext_re
    ext_time["time"]
    class ext_time ext;
    readmenator__agent_output_py -.->|imports| ext_time
    ext_collections["collections"]
    class ext_collections ext;
    readmenator__agent_output_py -.->|imports| ext_collections
    readmenator__agent_output_py -.->|imports| ext_pathlib
    readmenator__agent_output_py -.->|imports| ext_typing
    ext_readmenator__cache["readmenator._cache"]
    class ext_readmenator__cache ext;
    readmenator__agent_output_py -.->|imports| ext_readmenator__cache
    readmenator__agent_output_py -.->|imports| ext_readmenator__config
    ext_readmenator__gitmeta["readmenator._gitmeta"]
    class ext_readmenator__gitmeta ext;
    readmenator__agent_output_py -.->|imports| ext_readmenator__gitmeta
    readmenator__agent_output_py -.->|imports| ext_readmenator__models
    ext_readmenator__purpose["readmenator._purpose"]
    class ext_readmenator__purpose ext;
    readmenator__agent_output_py -.->|imports| ext_readmenator__purpose
    ext_readmenator__resolver["readmenator._resolver"]
    class ext_readmenator__resolver ext;
    readmenator__agent_output_py -.->|imports| ext_readmenator__resolver
    ext_readmenator__security["readmenator._security"]
    class ext_readmenator__security ext;
    readmenator__agent_output_py -.->|imports| ext_readmenator__security
    readmenator__analyzer_py -.->|imports| ext___future__
    ext_hashlib["hashlib"]
    class ext_hashlib ext;
    readmenator__analyzer_py -.->|imports| ext_hashlib
    ext_math["math"]
    class ext_math ext;
    readmenator__analyzer_py -.->|imports| ext_math
    ext_random["random"]
    class ext_random ext;
    readmenator__analyzer_py -.->|imports| ext_random
    readmenator__analyzer_py -.->|imports| ext_collections
    readmenator__analyzer_py -.->|imports| ext_typing
    readmenator__analyzer_py -.->|imports| ext_readmenator__config
    readmenator__analyzer_py -.->|imports| ext_readmenator__models
    readmenator__app_py -.->|imports| ext___future__
    readmenator__app_py -.->|imports| ext_json
    readmenator__app_py -.->|imports| ext_logging
    ext_dataclasses["dataclasses"]
    class ext_dataclasses ext;
    readmenator__app_py -.->|imports| ext_dataclasses
    readmenator__app_py -.->|imports| ext_pathlib
    readmenator__app_py -.->|imports| ext_typing
    readmenator__app_py -.->|imports| ext_readmenator__cache
    readmenator__app_py -.->|imports| ext_readmenator__config
    ext_readmenator__cursorrules_generator["readmenator._cursorrules_generator"]
    class ext_readmenator__cursorrules_generator ext;
    readmenator__app_py -.->|imports| ext_readmenator__cursorrules_generator
    ext_readmenator__dead_code["readmenator._dead_code"]
    class ext_readmenator__dead_code ext;
    readmenator__app_py -.->|imports| ext_readmenator__dead_code
    readmenator__app_py -.->|imports| ext_readmenator__diagrams
    ext_readmenator__gh_wiki["readmenator._gh_wiki"]
    class ext_readmenator__gh_wiki ext;
    readmenator__app_py -.->|imports| ext_readmenator__gh_wiki
    ext_readmenator__layers["readmenator._layers"]
    class ext_readmenator__layers ext;
    readmenator__app_py -.->|imports| ext_readmenator__layers
    ext_readmenator__linter["readmenator._linter"]
    class ext_readmenator__linter ext;
    readmenator__app_py -.->|imports| ext_readmenator__linter
    readmenator__app_py -.->|imports| ext_readmenator__models
    ext_readmenator__pipeline["readmenator._pipeline"]
    class ext_readmenator__pipeline ext;
    readmenator__app_py -.->|imports| ext_readmenator__pipeline
    ext_readmenator__query["readmenator._query"]
    class ext_readmenator__query ext;
    readmenator__app_py -.->|imports| ext_readmenator__query
    readmenator__app_py -.->|imports| ext_readmenator__rank
    ext_readmenator__refactorizer["readmenator._refactorizer"]
    class ext_readmenator__refactorizer ext;
    readmenator__app_py -.->|imports| ext_readmenator__refactorizer
    readmenator__app_py -.->|imports| ext_readmenator__resolver
    ext_readmenator__watcher["readmenator._watcher"]
    class ext_readmenator__watcher ext;
    readmenator__app_py -.->|imports| ext_readmenator__watcher
    ext_readmenator__video["readmenator._video"]
    class ext_readmenator__video ext;
    readmenator__app_py -.->|imports| ext_readmenator__video
    readmenator__cache_py -.->|imports| ext___future__
    readmenator__cache_py -.->|imports| ext_hashlib
    readmenator__cache_py -.->|imports| ext_json
    readmenator__cache_py -.->|imports| ext_os
    readmenator__cache_py -.->|imports| ext_pathlib
    readmenator__cache_py -.->|imports| ext_typing
    readmenator__cache_py -.->|imports| ext_readmenator__config
    readmenator__category_py -.->|imports| ext___future__
    readmenator__category_py -.->|imports| ext_dataclasses
    ext_enum["enum"]
    class ext_enum ext;
    readmenator__category_py -.->|imports| ext_enum
    readmenator__category_py -.->|imports| ext_typing
    readmenator__config_py -.->|imports| ext___future__
    readmenator__config_py -.->|imports| ext_dataclasses
    readmenator__config_py -.->|imports| ext_typing
    readmenator__cpg_py -.->|imports| ext___future__
    readmenator__cpg_py -.->|imports| ext_hashlib
    readmenator__cpg_py -.->|imports| ext_json
    readmenator__cpg_py -.->|imports| ext_typing
    readmenator__cpg_py -.->|imports| ext_readmenator__models
    readmenator__cursorrules_generator_py -.->|imports| ext___future__
    readmenator__cursorrules_generator_py -.->|imports| ext_pathlib
    readmenator__cursorrules_generator_py -.->|imports| ext_typing
    readmenator__cursorrules_generator_py -.->|imports| ext_readmenator__config
    readmenator__cursorrules_generator_py -.->|imports| ext_readmenator__layers
    readmenator__cursorrules_generator_py -.->|imports| ext_readmenator__models
    readmenator__dataflow_py -.->|imports| ext___future__
    readmenator__dataflow_py -.->|imports| ext_logging
    readmenator__dataflow_py -.->|imports| ext_re
    readmenator__dataflow_py -.->|imports| ext_typing
    readmenator__dataflow_py -.->|imports| ext_readmenator__config
    readmenator__dataflow_py -.->|imports| ext_readmenator__models
    readmenator__dead_code_py -.->|imports| ext___future__
    readmenator__dead_code_py -.->|imports| ext_collections
    readmenator__dead_code_py -.->|imports| ext_typing
    readmenator__dead_code_py -.->|imports| ext_readmenator__config
    readmenator__dead_code_py -.->|imports| ext_readmenator__models
    readmenator__diagrams_py -.->|imports| ext___future__
    ext_html["html"]
    class ext_html ext;
    readmenator__diagrams_py -.->|imports| ext_html
    readmenator__diagrams_py -.->|imports| ext_json
    readmenator__diagrams_py -.->|imports| ext_dataclasses
    readmenator__diagrams_py -.->|imports| ext_pathlib
    readmenator__diagrams_py -.->|imports| ext_typing
    readmenator__diagrams_py -.->|imports| ext_readmenator__config
    readmenator__diagrams_py -.->|imports| ext_readmenator__models
    ext_shutil["shutil"]
    class ext_shutil ext;
    readmenator__diagrams_py -.->|imports| ext_shutil
    readmenator__documentation_py -.->|imports| ext___future__
    readmenator__documentation_py -.->|imports| ext_subprocess
    readmenator__documentation_py -.->|imports| ext_collections
    readmenator__documentation_py -.->|imports| ext_typing
    readmenator__documentation_py -.->|imports| ext_readmenator__config
    ext_readmenator__cpg["readmenator._cpg"]
    class ext_readmenator__cpg ext;
    readmenator__documentation_py -.->|imports| ext_readmenator__cpg
    ext_readmenator__mermaid["readmenator._mermaid"]
    class ext_readmenator__mermaid ext;
    readmenator__documentation_py -.->|imports| ext_readmenator__mermaid
    readmenator__documentation_py -.->|imports| ext_readmenator__uml
    readmenator__documentation_py -.->|imports| ext_readmenator__models
    readmenator__documentation_py -.->|imports| ext_readmenator__rank
    readmenator__explain_py -.->|imports| ext___future__
    readmenator__explain_py -.->|imports| ext_typing
    readmenator__explain_py -.->|imports| ext_readmenator__category
    readmenator__explain_py -.->|imports| ext_readmenator__rank
    readmenator__exporter_py -.->|imports| ext___future__
    readmenator__exporter_py -.->|imports| ext_json
    readmenator__exporter_py -.->|imports| ext_math
    readmenator__exporter_py -.->|imports| ext_os
    readmenator__exporter_py -.->|imports| ext_pathlib
    ext_textwrap["textwrap"]
    class ext_textwrap ext;
    readmenator__exporter_py -.->|imports| ext_textwrap
    readmenator__exporter_py -.->|imports| ext_typing
    readmenator__exporter_py -.->|imports| ext_readmenator__config
    readmenator__exporter_py -.->|imports| ext_readmenator__models
    readmenator__exporter_py -.->|imports| ext_os
    readmenator__gh_wiki_py -.->|imports| ext___future__
    readmenator__gh_wiki_py -.->|imports| ext_logging
    ext_posixpath["posixpath"]
    class ext_posixpath ext;
    readmenator__gh_wiki_py -.->|imports| ext_posixpath
    readmenator__gh_wiki_py -.->|imports| ext_re
    readmenator__gh_wiki_py -.->|imports| ext_shutil
    readmenator__gh_wiki_py -.->|imports| ext_subprocess
    ext_tempfile["tempfile"]
    class ext_tempfile ext;
    readmenator__gh_wiki_py -.->|imports| ext_tempfile
    readmenator__gh_wiki_py -.->|imports| ext_dataclasses
    readmenator__gh_wiki_py -.->|imports| ext_pathlib
    readmenator__gh_wiki_py -.->|imports| ext_typing
    readmenator__gh_wiki_py -.->|imports| ext_readmenator__config
    readmenator__gh_wiki_py -.->|imports| ext_readmenator__gitmeta
    readmenator__gitmeta_py -.->|imports| ext___future__
    readmenator__gitmeta_py -.->|imports| ext_pathlib
    readmenator__gitmeta_py -.->|imports| ext_typing
    readmenator__hotspots_py -.->|imports| ext___future__
    readmenator__hotspots_py -.->|imports| ext_collections
    readmenator__hotspots_py -.->|imports| ext_typing
    readmenator__hotspots_py -.->|imports| ext_readmenator__config
    readmenator__hotspots_py -.->|imports| ext_readmenator__models
    readmenator__layer_rules_py -.->|imports| ext___future__
    readmenator__layer_rules_py -.->|imports| ext_typing
    readmenator__layer_rules_py -.->|imports| ext_readmenator__config
    readmenator__layer_rules_py -.->|imports| ext_readmenator__models
    readmenator__layers_py -.->|imports| ext___future__
    readmenator__layers_py -.->|imports| ext_re
    readmenator__layers_py -.->|imports| ext_collections
    readmenator__layers_py -.->|imports| ext_typing
    readmenator__layers_py -.->|imports| ext_readmenator__models
    readmenator__linter_py -.->|imports| ext___future__
    readmenator__linter_py -.->|imports| ext_pathlib
    readmenator__linter_py -.->|imports| ext_typing
    readmenator__linter_py -.->|imports| ext_readmenator__config
    readmenator__linter_py -.->|imports| ext_readmenator__layers
    readmenator__linter_py -.->|imports| ext_readmenator__models
    readmenator__mcp_server_py -.->|imports| ext___future__
    readmenator__mcp_server_py -.->|imports| ext_json
    readmenator__mcp_server_py -.->|imports| ext_logging
    readmenator__mcp_server_py -.->|imports| ext_sys
    readmenator__mcp_server_py -.->|imports| ext_pathlib
    readmenator__mcp_server_py -.->|imports| ext_typing
    readmenator__mcp_server_py -.->|imports| ext_readmenator__app
    readmenator__mcp_server_py -.->|imports| ext_readmenator__config
    readmenator__mcp_server_py -.->|imports| ext_readmenator__layers
    readmenator__mcp_server_py -.->|imports| ext_readmenator__models
    readmenator__mcp_server_py -.->|imports| ext_readmenator__query
    readmenator__mermaid_py -.->|imports| ext___future__
    readmenator__mermaid_py -.->|imports| ext_re
    readmenator__mermaid_py -.->|imports| ext_typing
    readmenator__mermaid_py -.->|imports| ext_readmenator__models
    readmenator__models_py -.->|imports| ext___future__
    readmenator__models_py -.->|imports| ext_dataclasses
    readmenator__models_py -.->|imports| ext_typing
    readmenator__models_py -.->|imports| ext_readmenator__category
    readmenator__pipeline_py -.->|imports| ext___future__
    readmenator__pipeline_py -.->|imports| ext_typing
    ext_readmenator__agent_injector["readmenator._agent_injector"]
    class ext_readmenator__agent_injector ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__agent_injector
    ext_readmenator__agent_output["readmenator._agent_output"]
    class ext_readmenator__agent_output ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__agent_output
    ext_readmenator__analyzer["readmenator._analyzer"]
    class ext_readmenator__analyzer ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__analyzer
    readmenator__pipeline_py -.->|imports| ext_readmenator__category
    readmenator__pipeline_py -.->|imports| ext_readmenator__config
    readmenator__pipeline_py -.->|imports| ext_readmenator__cpg
    ext_readmenator__dataflow["readmenator._dataflow"]
    class ext_readmenator__dataflow ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__dataflow
    readmenator__pipeline_py -.->|imports| ext_readmenator__diagrams
    ext_readmenator__documentation["readmenator._documentation"]
    class ext_readmenator__documentation ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__documentation
    ext_readmenator__exporter["readmenator._exporter"]
    class ext_readmenator__exporter ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__exporter
    readmenator__pipeline_py -.->|imports| ext_readmenator__gh_wiki
    ext_readmenator__hotspots["readmenator._hotspots"]
    class ext_readmenator__hotspots ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__hotspots
    ext_readmenator__layer_rules["readmenator._layer_rules"]
    class ext_readmenator__layer_rules ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__layer_rules
    readmenator__pipeline_py -.->|imports| ext_readmenator__layers
    readmenator__pipeline_py -.->|imports| ext_readmenator__models
    readmenator__pipeline_py -.->|imports| ext_readmenator__rank
    readmenator__pipeline_py -.->|imports| ext_readmenator__readme_injector
    ext_readmenator__rule_gen["readmenator._rule_gen"]
    class ext_readmenator__rule_gen ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__rule_gen
    ext_readmenator__sarif["readmenator._sarif"]
    class ext_readmenator__sarif ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__sarif
    ext_readmenator__scanner["readmenator._scanner"]
    class ext_readmenator__scanner ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__scanner
    readmenator__pipeline_py -.->|imports| ext_readmenator__security
    ext_readmenator__taint["readmenator._taint"]
    class ext_readmenator__taint ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__taint
    readmenator__pipeline_py -.->|imports| ext_readmenator__uml
    readmenator__pipeline_py -.->|imports| ext_readmenator__video
    ext_readmenator__wiki["readmenator._wiki"]
    class ext_readmenator__wiki ext;
    readmenator__pipeline_py -.->|imports| ext_readmenator__wiki
    readmenator__projections_py -.->|imports| ext___future__
    readmenator__projections_py -.->|imports| ext_typing
    readmenator__projections_py -.->|imports| ext_readmenator__category
    readmenator__projections_py -.->|imports| ext_readmenator__models
    readmenator__purpose_py -.->|imports| ext___future__
    readmenator__purpose_py -.->|imports| ext_re
    readmenator__purpose_py -.->|imports| ext_typing
    readmenator__purpose_py -.->|imports| ext_readmenator__models
    readmenator__query_py -.->|imports| ext___future__
    readmenator__query_py -.->|imports| ext_collections
    readmenator__query_py -.->|imports| ext_typing
    readmenator__query_py -.->|imports| ext_readmenator__category
    readmenator__query_py -.->|imports| ext_readmenator__models
    readmenator__query_py -.->|imports| ext_readmenator__rank
    readmenator__rank_py -.->|imports| ext___future__
    readmenator__rank_py -.->|imports| ext_math
    readmenator__rank_py -.->|imports| ext_dataclasses
    readmenator__rank_py -.->|imports| ext_typing
    readmenator__rank_py -.->|imports| ext_readmenator__category
    readmenator__readme_injector_py -.->|imports| ext___future__
    readmenator__readme_injector_py -.->|imports| ext_logging
    readmenator__readme_injector_py -.->|imports| ext_pathlib
    readmenator__readme_injector_py -.->|imports| ext_typing
    readmenator__refactorizer_py -.->|imports| ext___future__
    readmenator__refactorizer_py -.->|imports| ext_re
    readmenator__refactorizer_py -.->|imports| ext_pathlib
    readmenator__refactorizer_py -.->|imports| ext_typing
    readmenator__refactorizer_py -.->|imports| ext_readmenator__config
    readmenator__refactorizer_py -.->|imports| ext_readmenator__models
    readmenator__resolver_py -.->|imports| ext___future__
    readmenator__resolver_py -.->|imports| ext_posixpath
    readmenator__resolver_py -.->|imports| ext_re
    readmenator__resolver_py -.->|imports| ext_pathlib
    readmenator__resolver_py -.->|imports| ext_typing
    readmenator__resolver_py -.->|imports| ext_readmenator__config
    readmenator__rule_gen_py -.->|imports| ext___future__
    readmenator__rule_gen_py -.->|imports| ext_os
    readmenator__rule_gen_py -.->|imports| ext_collections
    readmenator__rule_gen_py -.->|imports| ext_pathlib
    readmenator__rule_gen_py -.->|imports| ext_typing
    readmenator__rule_gen_py -.->|imports| ext_readmenator__config
    readmenator__rule_gen_py -.->|imports| ext_readmenator__models
    readmenator__rule_gen_py -.->|imports| ext_re
    readmenator__sarif_py -.->|imports| ext___future__
    readmenator__sarif_py -.->|imports| ext_json
    readmenator__sarif_py -.->|imports| ext_typing
    readmenator__sarif_py -.->|imports| ext_readmenator__models
    readmenator__scanner_py -.->|imports| ext___future__
    readmenator__scanner_py -.->|imports| ext_logging
    readmenator__scanner_py -.->|imports| ext_re
    readmenator__scanner_py -.->|imports| ext_pathlib
    readmenator__scanner_py -.->|imports| ext_typing
    readmenator__scanner_py -.->|imports| ext_readmenator__config
    readmenator__scanner_py -.->|imports| ext_readmenator__models
    ext_readmenator_parsers["readmenator.parsers"]
    class ext_readmenator_parsers ext;
    readmenator__scanner_py -.->|imports| ext_readmenator_parsers
    readmenator__security_py -.->|imports| ext___future__
    readmenator__security_py -.->|imports| ext_re
    readmenator__security_py -.->|imports| ext_dataclasses
    readmenator__security_py -.->|imports| ext_pathlib
    readmenator__security_py -.->|imports| ext_typing
    readmenator__security_py -.->|imports| ext_readmenator__config
    readmenator__security_py -.->|imports| ext_readmenator__models
    readmenator__taint_py -.->|imports| ext___future__
    readmenator__taint_py -.->|imports| ext_collections
    readmenator__taint_py -.->|imports| ext_typing
    readmenator__taint_py -.->|imports| ext_readmenator__config
    readmenator__taint_py -.->|imports| ext_readmenator__models
    readmenator__uml_py -.->|imports| ext___future__
    readmenator__uml_py -.->|imports| ext_collections
    readmenator__uml_py -.->|imports| ext_typing
    readmenator__uml_py -.->|imports| ext_readmenator__config
    readmenator__uml_py -.->|imports| ext_readmenator__models
    readmenator__uml_py -.->|imports| ext_enum
    readmenator__video_py -.->|imports| ext___future__
    ext_colorsys["colorsys"]
    class ext_colorsys ext;
    readmenator__video_py -.->|imports| ext_colorsys
    readmenator__video_py -.->|imports| ext_hashlib
    readmenator__video_py -.->|imports| ext_math
    ext_multiprocessing["multiprocessing"]
    class ext_multiprocessing ext;
    readmenator__video_py -.->|imports| ext_multiprocessing
    readmenator__video_py -.->|imports| ext_os
    readmenator__video_py -.->|imports| ext_shutil
    readmenator__video_py -.->|imports| ext_subprocess
    readmenator__video_py -.->|imports| ext_dataclasses
    readmenator__video_py -.->|imports| ext_pathlib
    readmenator__video_py -.->|imports| ext_typing
    readmenator__video_py -.->|imports| ext_readmenator__config
    readmenator__video_py -.->|imports| ext_readmenator__models
    ext_PIL["PIL"]
    class ext_PIL ext;
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__video_py -.->|imports| ext_PIL
    ext_networkx["networkx"]
    class ext_networkx ext;
    readmenator__video_py -.->|imports| ext_networkx
    readmenator__video_py -.->|imports| ext_PIL
    readmenator__watcher_py -.->|imports| ext___future__
    readmenator__watcher_py -.->|imports| ext_hashlib
    readmenator__watcher_py -.->|imports| ext_logging
    readmenator__watcher_py -.->|imports| ext_time
    readmenator__watcher_py -.->|imports| ext_pathlib
    readmenator__watcher_py -.->|imports| ext_typing
    readmenator__watcher_py -.->|imports| ext_readmenator__config
    readmenator__wiki_py -.->|imports| ext___future__
    readmenator__wiki_py -.->|imports| ext_json
    readmenator__wiki_py -.->|imports| ext_logging
    readmenator__wiki_py -.->|imports| ext_os
    readmenator__wiki_py -.->|imports| ext_re
    readmenator__wiki_py -.->|imports| ext_time
    readmenator__wiki_py -.->|imports| ext_collections
    readmenator__wiki_py -.->|imports| ext_pathlib
    readmenator__wiki_py -.->|imports| ext_typing
    readmenator__wiki_py -.->|imports| ext_readmenator__config
    readmenator__wiki_py -.->|imports| ext_readmenator__analyzer
    readmenator__wiki_py -.->|imports| ext_readmenator__models
    readmenator__wiki_py -.->|imports| ext_readmenator__purpose
    readmenator__wiki_py -.->|imports| ext_readmenator__purpose
    readmenator__wiki_py -.->|imports| ext_readmenator__purpose
    readmenator__wiki_py -.->|imports| ext_readmenator__security
    readmenator_parsers___init___py -.->|imports| ext___future__
    readmenator_parsers___init___py -.->|imports| ext_typing
    readmenator_parsers___init___py -.->|imports| ext_readmenator__config
    ext_readmenator_parsers__base["readmenator.parsers._base"]
    class ext_readmenator_parsers__base ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__base
    ext_readmenator_parsers__c["readmenator.parsers._c"]
    class ext_readmenator_parsers__c ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__c
    ext_readmenator_parsers__python["readmenator.parsers._python"]
    class ext_readmenator_parsers__python ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__python
    ext_readmenator_parsers__go["readmenator.parsers._go"]
    class ext_readmenator_parsers__go ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__go
    ext_readmenator_parsers__rust["readmenator.parsers._rust"]
    class ext_readmenator_parsers__rust ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__rust
    ext_readmenator_parsers__javascript["readmenator.parsers._javascript"]
    class ext_readmenator_parsers__javascript ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__javascript
    ext_readmenator_parsers__java["readmenator.parsers._java"]
    class ext_readmenator_parsers__java ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__java
    ext_readmenator_parsers__csharp["readmenator.parsers._csharp"]
    class ext_readmenator_parsers__csharp ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__csharp
    ext_readmenator_parsers__shell["readmenator.parsers._shell"]
    class ext_readmenator_parsers__shell ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__shell
    ext_readmenator_parsers__php["readmenator.parsers._php"]
    class ext_readmenator_parsers__php ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__php
    ext_readmenator_parsers__dart["readmenator.parsers._dart"]
    class ext_readmenator_parsers__dart ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__dart
    ext_readmenator_parsers__gdscript["readmenator.parsers._gdscript"]
    class ext_readmenator_parsers__gdscript ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__gdscript
    ext_readmenator_parsers__nim["readmenator.parsers._nim"]
    class ext_readmenator_parsers__nim ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__nim
    ext_readmenator_parsers__assembly["readmenator.parsers._assembly"]
    class ext_readmenator_parsers__assembly ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__assembly
    ext_readmenator_parsers__ruby["readmenator.parsers._ruby"]
    class ext_readmenator_parsers__ruby ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__ruby
    ext_readmenator_parsers__swift["readmenator.parsers._swift"]
    class ext_readmenator_parsers__swift ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__swift
    ext_readmenator_parsers__kotlin["readmenator.parsers._kotlin"]
    class ext_readmenator_parsers__kotlin ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__kotlin
    ext_readmenator_parsers__scala["readmenator.parsers._scala"]
    class ext_readmenator_parsers__scala ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__scala
    ext_readmenator_parsers__lua["readmenator.parsers._lua"]
    class ext_readmenator_parsers__lua ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__lua
    ext_readmenator_parsers__elixir["readmenator.parsers._elixir"]
    class ext_readmenator_parsers__elixir ext;
    readmenator_parsers___init___py -.->|imports| ext_readmenator_parsers__elixir
    readmenator_parsers__assembly_py -.->|imports| ext___future__
    readmenator_parsers__assembly_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__assembly_py -.->|imports| ext_readmenator__models
    readmenator_parsers__assembly_py -.->|imports| ext_re
    readmenator_parsers__base_py -.->|imports| ext___future__
    readmenator_parsers__base_py -.->|imports| ext_re
    readmenator_parsers__base_py -.->|imports| ext_typing
    readmenator_parsers__base_py -.->|imports| ext_readmenator__config
    readmenator_parsers__base_py -.->|imports| ext_readmenator__models
    readmenator_parsers__c_py -.->|imports| ext___future__
    readmenator_parsers__c_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__c_py -.->|imports| ext_readmenator__models
    readmenator_parsers__c_py -.->|imports| ext_re
    readmenator_parsers__csharp_py -.->|imports| ext___future__
    readmenator_parsers__csharp_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__csharp_py -.->|imports| ext_readmenator__models
    readmenator_parsers__csharp_py -.->|imports| ext_re
    readmenator_parsers__dart_py -.->|imports| ext___future__
    readmenator_parsers__dart_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__dart_py -.->|imports| ext_readmenator__models
    readmenator_parsers__dart_py -.->|imports| ext_re
    readmenator_parsers__elixir_py -.->|imports| ext___future__
    readmenator_parsers__elixir_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__elixir_py -.->|imports| ext_readmenator__models
    readmenator_parsers__elixir_py -.->|imports| ext_re
    readmenator_parsers__gdscript_py -.->|imports| ext___future__
    readmenator_parsers__gdscript_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__gdscript_py -.->|imports| ext_readmenator__models
    readmenator_parsers__gdscript_py -.->|imports| ext_re
    readmenator_parsers__go_py -.->|imports| ext___future__
    readmenator_parsers__go_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__go_py -.->|imports| ext_readmenator__models
    readmenator_parsers__go_py -.->|imports| ext_re
    readmenator_parsers__java_py -.->|imports| ext___future__
    readmenator_parsers__java_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__java_py -.->|imports| ext_readmenator__models
    readmenator_parsers__java_py -.->|imports| ext_re
    readmenator_parsers__javascript_py -.->|imports| ext___future__
    readmenator_parsers__javascript_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__javascript_py -.->|imports| ext_readmenator__models
    readmenator_parsers__javascript_py -.->|imports| ext_re
    readmenator_parsers__kotlin_py -.->|imports| ext___future__
    readmenator_parsers__kotlin_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__kotlin_py -.->|imports| ext_readmenator__models
    readmenator_parsers__kotlin_py -.->|imports| ext_re
    readmenator_parsers__lua_py -.->|imports| ext___future__
    readmenator_parsers__lua_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__lua_py -.->|imports| ext_readmenator__models
    readmenator_parsers__lua_py -.->|imports| ext_re
    readmenator_parsers__nim_py -.->|imports| ext___future__
    readmenator_parsers__nim_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__nim_py -.->|imports| ext_readmenator__models
    readmenator_parsers__nim_py -.->|imports| ext_re
    readmenator_parsers__php_py -.->|imports| ext___future__
    readmenator_parsers__php_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__php_py -.->|imports| ext_readmenator__models
    readmenator_parsers__php_py -.->|imports| ext_re
    readmenator_parsers__python_py -.->|imports| ext___future__
    ext_ast["ast"]
    class ext_ast ext;
    readmenator_parsers__python_py -.->|imports| ext_ast
    ext_warnings["warnings"]
    class ext_warnings ext;
    readmenator_parsers__python_py -.->|imports| ext_warnings
    readmenator_parsers__python_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__python_py -.->|imports| ext_readmenator__models
    readmenator_parsers__ruby_py -.->|imports| ext___future__
    readmenator_parsers__ruby_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__ruby_py -.->|imports| ext_readmenator__models
    readmenator_parsers__ruby_py -.->|imports| ext_re
    readmenator_parsers__rust_py -.->|imports| ext___future__
    readmenator_parsers__rust_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__rust_py -.->|imports| ext_readmenator__models
    readmenator_parsers__rust_py -.->|imports| ext_re
    readmenator_parsers__scala_py -.->|imports| ext___future__
    readmenator_parsers__scala_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__scala_py -.->|imports| ext_readmenator__models
    readmenator_parsers__scala_py -.->|imports| ext_re
    readmenator_parsers__shell_py -.->|imports| ext___future__
    readmenator_parsers__shell_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__shell_py -.->|imports| ext_readmenator__models
    readmenator_parsers__shell_py -.->|imports| ext_re
    readmenator_parsers__swift_py -.->|imports| ext___future__
    readmenator_parsers__swift_py -.->|imports| ext_readmenator_parsers__base
    readmenator_parsers__swift_py -.->|imports| ext_readmenator__models
    readmenator_parsers__swift_py -.->|imports| ext_re
    readmenator_py -.->|imports| ext_sys
    readmenator_py -.->|imports| ext_pathlib
    ext_readmenator___main__["readmenator.__main__"]
    class ext_readmenator___main__ ext;
    readmenator_py -.->|imports| ext_readmenator___main__
    readmenator_orchestrator_py -.->|imports| ext_argparse
    readmenator_orchestrator_py -.->|imports| ext_logging
    readmenator_orchestrator_py -.->|imports| ext_os
    readmenator_orchestrator_py -.->|imports| ext_re
    ext_shlex["shlex"]
    class ext_shlex ext;
    readmenator_orchestrator_py -.->|imports| ext_shlex
    readmenator_orchestrator_py -.->|imports| ext_shutil
    readmenator_orchestrator_py -.->|imports| ext_subprocess
    readmenator_orchestrator_py -.->|imports| ext_sys
    readmenator_orchestrator_py -.->|imports| ext_tempfile
    readmenator_orchestrator_py -.->|imports| ext_unittest
    readmenator_orchestrator_py -.->|imports| ext_dataclasses
    ext_datetime["datetime"]
    class ext_datetime ext;
    readmenator_orchestrator_py -.->|imports| ext_datetime
    readmenator_orchestrator_py -.->|imports| ext_pathlib
    readmenator_orchestrator_py -.->|imports| ext_typing
    tests_test_agent_friendliness_py -.->|imports| ext_json
    tests_test_agent_friendliness_py -.->|imports| ext_os
    tests_test_agent_friendliness_py -.->|imports| ext_tempfile
    tests_test_agent_friendliness_py -.->|imports| ext_unittest
    tests_test_agent_friendliness_py -.->|imports| ext_dataclasses
    tests_test_agent_friendliness_py -.->|imports| ext_pathlib
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__agent_output
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__config
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__diagrams
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__gitmeta
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__layers
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__models
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__purpose
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__resolver
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__scanner
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__analyzer
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__cache
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__app
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__analyzer
    tests_test_agent_friendliness_py -.->|imports| ext_readmenator__analyzer
    tests_test_agent_injector_py -.->|imports| ext___future__
    tests_test_agent_injector_py -.->|imports| ext_shutil
    tests_test_agent_injector_py -.->|imports| ext_tempfile
    tests_test_agent_injector_py -.->|imports| ext_unittest
    tests_test_agent_injector_py -.->|imports| ext_pathlib
    ext_unittest_mock["unittest.mock"]
    class ext_unittest_mock ext;
    tests_test_agent_injector_py -.->|imports| ext_unittest_mock
    tests_test_agent_injector_py -.->|imports| ext_readmenator__agent_injector
    tests_test_agent_injector_py -.->|imports| ext_readmenator__agent_injector
    tests_test_agent_output_py -.->|imports| ext_os
    tests_test_agent_output_py -.->|imports| ext_unittest
    tests_test_agent_output_py -.->|imports| ext_pathlib
    tests_test_agent_output_py -.->|imports| ext_unittest_mock
    tests_test_agent_output_py -.->|imports| ext_readmenator__agent_output
    tests_test_agent_output_py -.->|imports| ext_readmenator__config
    tests_test_agent_output_py -.->|imports| ext_readmenator__models
    tests_test_agent_output_py -.->|imports| ext_dataclasses
    tests_test_agent_output_py -.->|imports| ext_readmenator__models
    tests_test_agent_output_py -.->|imports| ext_readmenator__models
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_readmenator__models
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_json
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_readmenator__agent_injector
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_readmenator__agent_injector
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_readmenator__readme_injector
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_agent_output_py -.->|imports| ext_readmenator__readme_injector
    tests_test_agent_output_py -.->|imports| ext_tempfile
    tests_test_analyzer_py -.->|imports| ext___future__
    tests_test_analyzer_py -.->|imports| ext_unittest
    tests_test_analyzer_py -.->|imports| ext_readmenator__analyzer
    tests_test_analyzer_py -.->|imports| ext_readmenator__config
    tests_test_analyzer_py -.->|imports| ext_readmenator__models
    tests_test_analyzer_py -.->|imports| ext_readmenator__analyzer
    tests_test_cache_py -.->|imports| ext___future__
    tests_test_cache_py -.->|imports| ext_os
    tests_test_cache_py -.->|imports| ext_tempfile
    tests_test_cache_py -.->|imports| ext_unittest
    tests_test_cache_py -.->|imports| ext_pathlib
    tests_test_cache_py -.->|imports| ext_readmenator__cache
    tests_test_cache_py -.->|imports| ext_readmenator__config
    tests_test_cache_py -.->|imports| ext_shutil
    tests_test_config_py -.->|imports| ext_unittest
    tests_test_config_py -.->|imports| ext_dataclasses
    tests_test_config_py -.->|imports| ext_readmenator__config
    tests_test_cpg_py -.->|imports| ext___future__
    tests_test_cpg_py -.->|imports| ext_json
    tests_test_cpg_py -.->|imports| ext_unittest
    tests_test_cpg_py -.->|imports| ext_readmenator__config
    tests_test_cpg_py -.->|imports| ext_readmenator__cpg
    tests_test_cpg_py -.->|imports| ext_readmenator__models
    tests_test_cursorrules_py -.->|imports| ext___future__
    tests_test_cursorrules_py -.->|imports| ext_tempfile
    tests_test_cursorrules_py -.->|imports| ext_unittest
    tests_test_cursorrules_py -.->|imports| ext_pathlib
    tests_test_cursorrules_py -.->|imports| ext_readmenator__config
    tests_test_cursorrules_py -.->|imports| ext_readmenator__cursorrules_generator
    tests_test_cursorrules_py -.->|imports| ext_readmenator__models
    tests_test_dataflow_py -.->|imports| ext_unittest
    tests_test_dataflow_py -.->|imports| ext_readmenator__config
    tests_test_dataflow_py -.->|imports| ext_readmenator__dataflow
    tests_test_dataflow_py -.->|imports| ext_readmenator__models
    tests_test_dataflow_py -.->|imports| ext_dataclasses
    tests_test_dataflow_py -.->|imports| ext_readmenator__models
    tests_test_dataflow_py -.->|imports| ext_readmenator__models
    tests_test_dead_code_py -.->|imports| ext___future__
    tests_test_dead_code_py -.->|imports| ext_unittest
    tests_test_dead_code_py -.->|imports| ext_readmenator__config
    tests_test_dead_code_py -.->|imports| ext_readmenator__dead_code
    tests_test_dead_code_py -.->|imports| ext_readmenator__models
    tests_test_diagrams_py -.->|imports| ext___future__
    tests_test_diagrams_py -.->|imports| ext_json
    tests_test_diagrams_py -.->|imports| ext_re
    tests_test_diagrams_py -.->|imports| ext_unittest
    tests_test_diagrams_py -.->|imports| ext_pathlib
    tests_test_diagrams_py -.->|imports| ext_readmenator__config
    tests_test_diagrams_py -.->|imports| ext_readmenator__diagrams
    tests_test_diagrams_py -.->|imports| ext_readmenator__models
    tests_test_diagrams_py -.->|imports| ext_readmenator__diagrams
    tests_test_diagrams_py -.->|imports| ext_re
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_dataclasses
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_dataclasses
    tests_test_diagrams_py -.->|imports| ext_dataclasses
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_readmenator__app
    tests_test_diagrams_py -.->|imports| ext_tempfile
    tests_test_diagrams_py -.->|imports| ext_dataclasses
    tests_test_diagrams_py -.->|imports| ext_readmenator__app
    tests_test_documentation_py -.->|imports| ext___future__
    tests_test_documentation_py -.->|imports| ext_unittest
    tests_test_documentation_py -.->|imports| ext_readmenator__config
    tests_test_documentation_py -.->|imports| ext_readmenator__documentation
    tests_test_documentation_py -.->|imports| ext_readmenator__models
    tests_test_documentation_py -.->|imports| ext_readmenator__models
    tests_test_documentation_py -.->|imports| ext_readmenator__models
    tests_test_documentation_py -.->|imports| ext_readmenator__models
    tests_test_documentation_py -.->|imports| ext_readmenator__models
    tests_test_exporter_py -.->|imports| ext___future__
    tests_test_exporter_py -.->|imports| ext_json
    tests_test_exporter_py -.->|imports| ext_unittest
    tests_test_exporter_py -.->|imports| ext_readmenator__config
    tests_test_exporter_py -.->|imports| ext_readmenator__exporter
    tests_test_exporter_py -.->|imports| ext_readmenator__models
    tests_test_gh_wiki_py -.->|imports| ext_subprocess
    tests_test_gh_wiki_py -.->|imports| ext_tempfile
    tests_test_gh_wiki_py -.->|imports| ext_unittest
    tests_test_gh_wiki_py -.->|imports| ext_dataclasses
    tests_test_gh_wiki_py -.->|imports| ext_pathlib
    tests_test_gh_wiki_py -.->|imports| ext_typing
    tests_test_gh_wiki_py -.->|imports| ext_readmenator__config
    tests_test_gh_wiki_py -.->|imports| ext_readmenator__gh_wiki
    tests_test_hotspots_py -.->|imports| ext___future__
    tests_test_hotspots_py -.->|imports| ext_unittest
    tests_test_hotspots_py -.->|imports| ext_readmenator__config
    tests_test_hotspots_py -.->|imports| ext_readmenator__hotspots
    tests_test_hotspots_py -.->|imports| ext_readmenator__models
    tests_test_integration_py -.->|imports| ext_tempfile
    tests_test_integration_py -.->|imports| ext_unittest
    tests_test_integration_py -.->|imports| ext_pathlib
    tests_test_integration_py -.->|imports| ext_readmenator__app
    tests_test_integration_py -.->|imports| ext_readmenator__config
    tests_test_integration_py -.->|imports| ext_shutil
    tests_test_layer_rules_py -.->|imports| ext___future__
    tests_test_layer_rules_py -.->|imports| ext_unittest
    tests_test_layer_rules_py -.->|imports| ext_readmenator__config
    tests_test_layer_rules_py -.->|imports| ext_readmenator__layer_rules
    tests_test_layer_rules_py -.->|imports| ext_readmenator__models
    tests_test_linter_py -.->|imports| ext___future__
    tests_test_linter_py -.->|imports| ext_unittest
    tests_test_linter_py -.->|imports| ext_readmenator__config
    tests_test_linter_py -.->|imports| ext_readmenator__linter
    tests_test_linter_py -.->|imports| ext_readmenator__models
    tests_test_mcp_server_py -.->|imports| ext___future__
    tests_test_mcp_server_py -.->|imports| ext_json
    tests_test_mcp_server_py -.->|imports| ext_unittest
    tests_test_mcp_server_py -.->|imports| ext_pathlib
    tests_test_mcp_server_py -.->|imports| ext_tempfile
    tests_test_mcp_server_py -.->|imports| ext_typing
    tests_test_mcp_server_py -.->|imports| ext_readmenator__mcp_server
    tests_test_mcp_server_py -.->|imports| ext_readmenator__app
    tests_test_mcp_server_py -.->|imports| ext_readmenator__config
    tests_test_mermaid_py -.->|imports| ext_unittest
    tests_test_mermaid_py -.->|imports| ext_readmenator__mermaid
    tests_test_mermaid_py -.->|imports| ext_readmenator__models
    tests_test_models_py -.->|imports| ext_unittest
    tests_test_models_py -.->|imports| ext_readmenator__models
    tests_test_parsers_py -.->|imports| ext_unittest
    tests_test_parsers_py -.->|imports| ext_readmenator__config
    tests_test_parsers_py -.->|imports| ext_readmenator_parsers
    tests_test_parsers_py -.->|imports| ext_warnings
    tests_test_parsers_new_py -.->|imports| ext___future__
    tests_test_parsers_new_py -.->|imports| ext_unittest
    tests_test_parsers_new_py -.->|imports| ext_readmenator__config
    tests_test_parsers_new_py -.->|imports| ext_readmenator_parsers
    tests_test_parsers_property_py -.->|imports| ext___future__
    tests_test_parsers_property_py -.->|imports| ext_sys
    tests_test_parsers_property_py -.->|imports| ext_unittest
    tests_test_parsers_property_py -.->|imports| ext_pathlib
    tests_test_parsers_property_py -.->|imports| ext_typing
    tests_test_parsers_property_py -.->|imports| ext_readmenator__config
    tests_test_parsers_property_py -.->|imports| ext_readmenator__models
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__python
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__c
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__go
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__rust
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__javascript
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__java
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__csharp
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__shell
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__php
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__dart
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__gdscript
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__nim
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__ruby
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__swift
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__kotlin
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__scala
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__lua
    tests_test_parsers_property_py -.->|imports| ext_readmenator_parsers__elixir
    ext_hypothesis["hypothesis"]
    class ext_hypothesis ext;
    tests_test_parsers_property_py -.->|imports| ext_hypothesis
    tests_test_query_py -.->|imports| ext_unittest
    tests_test_query_py -.->|imports| ext_readmenator__models
    tests_test_query_py -.->|imports| ext_readmenator__query
    tests_test_ranking_py -.->|imports| ext___future__
    tests_test_ranking_py -.->|imports| ext_typing
    ext_pytest["pytest"]
    class ext_pytest ext;
    tests_test_ranking_py -.->|imports| ext_pytest
    tests_test_ranking_py -.->|imports| ext_readmenator__category
    ext_readmenator__explain["readmenator._explain"]
    class ext_readmenator__explain ext;
    tests_test_ranking_py -.->|imports| ext_readmenator__explain
    tests_test_ranking_py -.->|imports| ext_readmenator__models
    ext_readmenator__projections["readmenator._projections"]
    class ext_readmenator__projections ext;
    tests_test_ranking_py -.->|imports| ext_readmenator__projections
    tests_test_ranking_py -.->|imports| ext_readmenator__rank
    tests_test_readme_injector_py -.->|imports| ext___future__
    tests_test_readme_injector_py -.->|imports| ext_tempfile
    tests_test_readme_injector_py -.->|imports| ext_unittest
    tests_test_readme_injector_py -.->|imports| ext_pathlib
    tests_test_readme_injector_py -.->|imports| ext_readmenator__readme_injector
    tests_test_readme_injector_py -.->|imports| ext_shutil
    tests_test_readme_injector_py -.->|imports| ext_shutil
    tests_test_readme_injector_py -.->|imports| ext_shutil
    tests_test_readme_injector_py -.->|imports| ext_shutil
    tests_test_refactorizer_py -.->|imports| ext___future__
    tests_test_refactorizer_py -.->|imports| ext_tempfile
    tests_test_refactorizer_py -.->|imports| ext_unittest
    tests_test_refactorizer_py -.->|imports| ext_pathlib
    tests_test_refactorizer_py -.->|imports| ext_readmenator__config
    tests_test_refactorizer_py -.->|imports| ext_readmenator__models
    tests_test_refactorizer_py -.->|imports| ext_readmenator__refactorizer
    tests_test_refactorizer_py -.->|imports| ext_readmenator__models
    tests_test_refactorizer_py -.->|imports| ext_readmenator__models
    tests_test_refactorizer_py -.->|imports| ext_readmenator__models
    tests_test_resolver_py -.->|imports| ext___future__
    tests_test_resolver_py -.->|imports| ext_unittest
    tests_test_resolver_py -.->|imports| ext_readmenator__resolver
    tests_test_rule_gen_py -.->|imports| ext___future__
    tests_test_rule_gen_py -.->|imports| ext_tempfile
    tests_test_rule_gen_py -.->|imports| ext_unittest
    tests_test_rule_gen_py -.->|imports| ext_pathlib
    tests_test_rule_gen_py -.->|imports| ext_readmenator__config
    tests_test_rule_gen_py -.->|imports| ext_readmenator__models
    tests_test_rule_gen_py -.->|imports| ext_readmenator__rule_gen
    tests_test_sarif_py -.->|imports| ext___future__
    tests_test_sarif_py -.->|imports| ext_json
    tests_test_sarif_py -.->|imports| ext_unittest
    tests_test_sarif_py -.->|imports| ext_readmenator__config
    tests_test_sarif_py -.->|imports| ext_readmenator__models
    tests_test_sarif_py -.->|imports| ext_readmenator__sarif
    tests_test_scanner_py -.->|imports| ext_os
    tests_test_scanner_py -.->|imports| ext_tempfile
    tests_test_scanner_py -.->|imports| ext_unittest
    tests_test_scanner_py -.->|imports| ext_pathlib
    tests_test_scanner_py -.->|imports| ext_readmenator__config
    tests_test_scanner_py -.->|imports| ext_readmenator__models
    tests_test_scanner_py -.->|imports| ext_readmenator__scanner
    tests_test_scanner_py -.->|imports| ext_shutil
    tests_test_scanner_py -.->|imports| ext_re
    tests_test_security_py -.->|imports| ext___future__
    tests_test_security_py -.->|imports| ext_os
    tests_test_security_py -.->|imports| ext_tempfile
    tests_test_security_py -.->|imports| ext_unittest
    tests_test_security_py -.->|imports| ext_pathlib
    tests_test_security_py -.->|imports| ext_readmenator__config
    tests_test_security_py -.->|imports| ext_readmenator__models
    tests_test_security_py -.->|imports| ext_readmenator__security
    tests_test_taint_py -.->|imports| ext___future__
    tests_test_taint_py -.->|imports| ext_unittest
    tests_test_taint_py -.->|imports| ext_readmenator__config
    tests_test_taint_py -.->|imports| ext_readmenator__models
    tests_test_taint_py -.->|imports| ext_readmenator__taint
    tests_test_taint_bdd_py -.->|imports| ext___future__
    tests_test_taint_bdd_py -.->|imports| ext_tempfile
    tests_test_taint_bdd_py -.->|imports| ext_pathlib
    tests_test_taint_bdd_py -.->|imports| ext_typing
    tests_test_taint_bdd_py -.->|imports| ext_readmenator__config
    tests_test_taint_bdd_py -.->|imports| ext_readmenator__models
    tests_test_taint_bdd_py -.->|imports| ext_readmenator__taint
    ext_pytest_bdd["pytest_bdd"]
    class ext_pytest_bdd ext;
    tests_test_taint_bdd_py -.->|imports| ext_pytest_bdd
    tests_test_taint_bdd_py -.->|imports| ext_readmenator__scanner
    tests_test_taint_bdd_py -.->|imports| ext_readmenator__resolver
    tests_test_taint_bdd_py -.->|imports| ext_unittest
    tests_test_uml_py -.->|imports| ext___future__
    tests_test_uml_py -.->|imports| ext_unittest
    tests_test_uml_py -.->|imports| ext_readmenator__config
    tests_test_uml_py -.->|imports| ext_readmenator__models
    tests_test_uml_py -.->|imports| ext_readmenator__uml
    tests_test_video_py -.->|imports| ext_unittest
    tests_test_video_py -.->|imports| ext_readmenator__config
    tests_test_video_py -.->|imports| ext_readmenator__models
    tests_test_video_py -.->|imports| ext_readmenator__video
    tests_test_video_py -.->|imports| ext_hashlib
    tests_test_video_py -.->|imports| ext_pathlib
    tests_test_video_py -.->|imports| ext_readmenator__app
    tests_test_wiki_py -.->|imports| ext_json
    tests_test_wiki_py -.->|imports| ext_os
    tests_test_wiki_py -.->|imports| ext_tempfile
    tests_test_wiki_py -.->|imports| ext_unittest
    tests_test_wiki_py -.->|imports| ext_pathlib
    tests_test_wiki_py -.->|imports| ext_readmenator__config
    tests_test_wiki_py -.->|imports| ext_readmenator__models
    tests_test_wiki_py -.->|imports| ext_readmenator__wiki
    tests_test_wiki_py -.->|imports| ext_dataclasses
    tests_test_wiki_py -.->|imports| ext_readmenator__wiki
    tests_test_wiki_py -.->|imports| ext_readmenator__models
    tests_test_wiki_py -.->|imports| ext_readmenator__wiki
Loading

UML Class Diagram

Auto-generated Mermaid class diagram from parsed class-level symbols. Shows classes, structs, interfaces, traits, and their methods with inheritance and dependency relationships.

classDiagram
  class _agent_injector_py_AgentInjector {
    <<class>>
    +ensure_readmenator_installed()
    +__init__(self, kb_filename, agent_output_dir, agent_files, agent_globs, wiki_output_dir)
    +inject(self, project_root)
    +remove(self, project_root)
    +find_agent_files(self, project_root)
    +_find_agent_files(self, root)
    +_inject_single(self, path)
    +_extract_current_injection(content)
    +_remove_old_injection(content)
    +_remove_single(self, path)
  }
  class _agent_output_py_AgentOutputGenerator {
    <<class>>
    +__init__(self, config)
    +generate(self, nodes, edges, resolved_edges, analysis, analysis_v2, findings, layers, project_root)
    +_infer_subsystems(self, nodes)
    +_build_index(self, nodes, subsystems, imported_by)
    +_build_architecture(self, edges, resolved_edges, nodes)
    +_build_security(self, findings, nodes)
    +_enclosing_symbol(symbols, line)
    +_is_public(self, sym)
    +_qualified_names(symbols)
    +_build_api(self, nodes, resolved_map, imported_by, layers)
  }
  class _analyzer_py_GraphAnalyzer {
    <<class>>
    +dominant_directory(file_ids)
    +__init__(self, config)
    +analyze(self, nodes, edges, resolved_edges)
    +_build_adjacency(self, nodes, edges)
    +_build_reverse_adjacency(self, adjacency)
    +_compute_god_nodes(self, nodes, adjacency, reverse_adjacency)
    +_detect_communities(self, nodes, adjacency)
    +_merge_small_communities(self, groups, adjacency, weights)
    +_vote_weights(self, file_ids, adjacency)
    +_label_communities(self, nodes, communities)
  }
  class _app_py_readmenatorApplication {
    <<class>>
    +__init__(self, config)
    +_scan(self, target_dir)
    +_scan_with_content(self, target_dir)
    +_resolve_imports(self, nodes, edges, target_dir)
    +run(self, target_dir, resolve_imports, run_analysis, run_security, run_v2_analysis)
    +check_freshness(self, target_dir)
    +_maybe_refresh_pages(self, root)
    +_maybe_publish_github_wiki(self, root)
    +publish_github_wiki(self, target_dir, dry_run)
    +_write_sidecar_outputs(self, root, findings, analysis_v2)
  }
  class _cache_py_FileCache {
    <<class>>
    +source_fingerprint(project_root, file_ids)
    +__init__(self, config, project_root)
    +load(self)
    +save(self, hashes)
    +compute_hash(self, file_path)
    +compute_hashes(self, file_paths)
    +find_changed(self, file_paths)
    +prune_deleted(self, current_file_ids)
    +save_analysis(self, key, data)
    +load_analysis(self, key)
  }
  class _category_py_EdgeKind {
    <<class>>
    +build_category_from_edges(edges, resolved_edges, node_ids)
    +_infer_edge_kind(relation)
    +__str__(self)
    +weight(self)
    +__init__(self)
    +add_object(self, obj_id)
    +add_morphism(self, m)
    +objects(self)
    +morphisms(self)
    +outgoing(self, obj_id)
  }
  class _category_py_Morphism {
    <<class>>
    +build_category_from_edges(edges, resolved_edges, node_ids)
    +_infer_edge_kind(relation)
    +__str__(self)
    +weight(self)
    +__init__(self)
    +add_object(self, obj_id)
    +add_morphism(self, m)
    +objects(self)
    +morphisms(self)
    +outgoing(self, obj_id)
  }
  class _category_py_Category {
    <<class>>
    +build_category_from_edges(edges, resolved_edges, node_ids)
    +_infer_edge_kind(relation)
    +__str__(self)
    +weight(self)
    +__init__(self)
    +add_object(self, obj_id)
    +add_morphism(self, m)
    +objects(self)
    +morphisms(self)
    +outgoing(self, obj_id)
  }
  class _category_py_TypedGraph {
    <<class>>
    +build_category_from_edges(edges, resolved_edges, node_ids)
    +_infer_edge_kind(relation)
    +__str__(self)
    +weight(self)
    +__init__(self)
    +add_object(self, obj_id)
    +add_morphism(self, m)
    +objects(self)
    +morphisms(self)
    +outgoing(self, obj_id)
  }
  class _config_py_Config {
    <<class>>
  }
  class _cpg_py_CodePropertyGraph {
    <<class>>
    +__init__(self, privacy_mode, cpg_context)
    +generate(self, nodes, edges, resolved_edges, analysis, findings)
    +_severity_counts(self, findings)
    +_build_symbol_list(self, node)
    +_compute_node_hash(node)
  }
  class _cursorrules_generator_py_CursorRulesGenerator {
    <<class>>
    +__init__(self, config)
    +generate(self, nodes, edges, analysis, layers, violations, project_root)
    +_build_base_rules(self)
    +_extract_layer_constraints(self, layers)
    +_extract_analysis_constraints(self, analysis)
    +_extract_violation_rules(self, violations)
    +_write_file(self, project_root, content)
  }
  class _dataflow_py_DataflowAnalyzer {
    <<class>>
    +_strip_noise(line)
    +_strip_block_comments(content)
    +_strip_sizeof(line)
    +_blank(match)
    +__init__(self, config)
    +analyze(self, nodes, content_map)
    +_brace_depths(lines)
    +_function_spans(self, node, total_lines, depths)
    +_analyze_function(self, file_id, func, lines, start, end)
    +_scan_reads(text, lineno, reads, assigned, declared_names)
  }
  class _dead_code_py_DeadCodeStripper {
    <<class>>
    +__init__(self, config)
    +identify(self, nodes, edges, resolved_edges)
    +_build_in_degree_map(self, nodes, resolved_edges)
    +_classify_recommendation(self, symbol)
  }
  class _diagrams_py_MapNode {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_MapEdge {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_MapView {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_SystemMap {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_MapDiagnostic {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_MapReceipt {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_MapDelta {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_SystemMapValidator {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_SystemMapBuilder {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_InteractiveMapRenderer {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_VisNetworkRenderer {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _diagrams_py_DocsSitePublisher {
    <<class>>
    +_escape_markup(value)
    +_json_payload(payload)
    +_role_color(role, config)
    +__init__(self, config)
    +_effective_canvas(self, system_map)
    +validate(self, system_map)
    +__init__(self, config)
    +supported_kinds(self)
    +_is_full(self, full)
    +build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)
  }
  class _documentation_py_DocumentationGenerator {
    <<class>>
    +__init__(self, config)
    +_ranking_version(self)
    +_get_git_commit()
    +generate(self, nodes, edges, resolved_edges, analysis, layers, findings, analysis_v2, ranked)
    +_apply_context_budget(self, content, nodes, edges, resolved_edges, analysis, analysis_v2, findings)
    +_build_toc(self, nodes, analysis, layers, findings, analysis_v2, is_truncated, ranked)
    +_build_layers(self, layers, nodes)
    +_build_dashboard(self, nodes, edges, resolved_edges)
    +_build_god_nodes(self, analysis, ranked)
    +_build_community_analysis(self, analysis, nodes)
  }
  class _exporter_py_GraphExporter {
    <<class>>
    +__init__(self, config)
    +to_json(self, nodes, edges, resolved_edges, analysis, findings)
    +to_html(self, nodes, edges, resolved_edges, analysis, findings)
    +_community_color_map(self, analysis)
    +_lighten(hex_color)
    +_render_html(self, vis_nodes, vis_edges, analysis, findings)
    +to_svg(self, nodes, edges, resolved_edges, analysis)
    +_render_truncated_svg(self, total_nodes)
    +_layout_spring(self, nodes, edges, node_map)
    +to_graphml(self, nodes, edges, resolved_edges, analysis)
  }
  class _gh_wiki_py_WikiPublishResult {
    <<class>>
    +__init__(self, config, runner)
    +page_name(self, rel_path)
    +collect_sources(self, project_root)
    +_blob_base(self, remote, commit)
    +rewrite(self, text, rel_path, names, project_root, blob_base)
    +render(self, project_root, remote)
    +_fallback_home(self, project_name)
    +_sidebar(self, names)
    +_footer(git)
    +wiki_remote(self, project_root)
  }
  class _gh_wiki_py_GitHubWikiPublisher {
    <<class>>
    +__init__(self, config, runner)
    +page_name(self, rel_path)
    +collect_sources(self, project_root)
    +_blob_base(self, remote, commit)
    +rewrite(self, text, rel_path, names, project_root, blob_base)
    +render(self, project_root, remote)
    +_fallback_home(self, project_name)
    +_sidebar(self, names)
    +_footer(git)
    +wiki_remote(self, project_root)
  }
  class _hotspots_py_HotspotAnalyzer {
    <<class>>
    +__init__(self, config)
    +analyze_hotspots(self, nodes, edges, resolved_edges)
    +detect_cycles(self, nodes, resolved_edges)
    +analyze_change_impact(self, nodes, resolved_edges)
    +_dfs_visit(current)
    +_record_cycle(start, end)
  }
  class _layer_rules_py_LayerRuleEngine {
    <<class>>
    +__init__(self, config)
    +detect_violations(self, nodes, edges, resolved_edges, layers)
    +violation_summary(violations)
  }
  class _layers_py_LayerDetector {
    <<class>>
    +detect(self, nodes, edges)
    +_path_tokens(cls, node_id)
    +_pattern_hits(cls, pattern, tokens, joined)
    +_import_roots(cls, imports)
    +_classify_file(self, node, edges, imports)
    +layer_summary(layers)
  }
  class _linter_py_ArchitectureLinter {
    <<class>>
    +__init__(self, config)
    +lint(self, nodes, edges, resolved_edges, layers, content_map)
    +_check_file_length(self, nodes, content_map)
    +_check_cross_layer_violations(self, nodes, edges, resolved_edges, layers)
    +_check_circular_dependencies(self, nodes, resolved_edges)
    +_dfs(current)
  }
  class _mcp_server_py_MCPError {
    <<class>>
    +main()
    +__init__(self, code, message, data)
    +__init__(self, msg)
    +is_notification(self)
    +response(self, result)
    +error(self, code, message, data)
    +__init__(self, name, description, handler, input_schema)
    +definition(self)
    +call(self, arguments)
    +__init__(self, uri, name, description, mime_type, handler)
  }
  class _mcp_server_py_MCPRequest {
    <<class>>
    +main()
    +__init__(self, code, message, data)
    +__init__(self, msg)
    +is_notification(self)
    +response(self, result)
    +error(self, code, message, data)
    +__init__(self, name, description, handler, input_schema)
    +definition(self)
    +call(self, arguments)
    +__init__(self, uri, name, description, mime_type, handler)
  }
  class _mcp_server_py_MCPTool {
    <<class>>
    +main()
    +__init__(self, code, message, data)
    +__init__(self, msg)
    +is_notification(self)
    +response(self, result)
    +error(self, code, message, data)
    +__init__(self, name, description, handler, input_schema)
    +definition(self)
    +call(self, arguments)
    +__init__(self, uri, name, description, mime_type, handler)
  }
  class _mcp_server_py_MCPResource {
    <<class>>
    +main()
    +__init__(self, code, message, data)
    +__init__(self, msg)
    +is_notification(self)
    +response(self, result)
    +error(self, code, message, data)
    +__init__(self, name, description, handler, input_schema)
    +definition(self)
    +call(self, arguments)
    +__init__(self, uri, name, description, mime_type, handler)
  }
  class _mcp_server_py_MCPServer {
    <<class>>
    +main()
    +__init__(self, code, message, data)
    +__init__(self, msg)
    +is_notification(self)
    +response(self, result)
    +error(self, code, message, data)
    +__init__(self, name, description, handler, input_schema)
    +definition(self)
    +call(self, arguments)
    +__init__(self, uri, name, description, mime_type, handler)
  }
  class _mermaid_py_MermaidRenderer {
    <<class>>
    +__init__(self, max_nodes, max_symbols_per_file, module_style, class_style, function_style, external_style, internal_edge_style)
    +_sanitize_id(node_id)
    +render(self, nodes, edges, resolved_edges, analysis)
  }
  class _models_py_Symbol {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_Node {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_Edge {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_SecurityFinding {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_CommunityResult {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_AnalysisResult {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_TaintPath {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_TaintAnalysisResult {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_DependencyCycle {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
  class _models_py_ChangeImpact {
    <<class>>
    +pluralize_symbol_kind(kind, plural_map)
  }
Loading

Code Property Graph

Machine-readable Code Property Graph (CPG) in JSON-LD format. This block allows AI agents to parse the full structural graph without additional file reads. Compatible with GraphRAG pipelines.

{"@context": "https://schema.org", "analysis": {"communities": [{"cohesion": 0.55, "id": 0, "label": "readmenator: _diagrams", "size": 50}, {"cohesion": 0.286, "id": 1, "label": "tests: _agent_injector", "size": 3}, {"cohesion": 0.351, "id": 2, "label": "readmenator: _agent_output", "size": 10}, {"cohesion": 0.421, "id": 3, "label": "readmenator: _category", "size": 5}, {"cohesion": 0.231, "id": 4, "label": "readmenator: _documentation", "size": 4}, {"cohesion": 0.562, "id": 5, "label": "readmenator/parsers", "size": 26}, {"cohesion": 0.211, "id": 6, "label": "tests: _scanner", "size": 5}], "god_nodes": [{"node_id": "readmenator/_models.py", "score": 160.0}, {"node_id": "readmenator/_config.py", "score": 122.1}, {"node_id": "readmenator/_pipeline.py", "score": 55.4}, {"node_id": "readmenator/_app.py", "score": 53.0}, {"node_id": "readmenator/parsers/__init__.py", "score": 48.2}, {"node_id": "readmenator/parsers/_base.py", "score": 44.6}, {"node_id": "tests/test_parsers_property.py", "score": 42.7}, {"node_id": "tests/test_agent_friendliness.py", "score": 28.3}, {"node_id": "readmenator/_agent_output.py", "score": 23.2}, {"node_id": "readmenator/_diagrams.py", "score": 21.9}], "surprising_connections": [{"hops": 5, "source": "readmenator.py", "target": "tests/test_agent_injector.py"}, {"hops": 5, "source": "tests/test_agent_injector.py", "target": "tests/test_resolver.py"}, {"hops": 5, "source": "tests/test_readme_injector.py", "target": "tests/test_resolver.py"}, {"hops": 4, "source": "readmenator/__init__.py", "target": "tests/test_agent_injector.py"}, {"hops": 4, "source": "readmenator/__main__.py", "target": "tests/test_agent_injector.py"}]}, "edges": [{"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._mcp_server"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._readme_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__init__.py", "target": "readmenator._uml"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "argparse"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/__main__.py", "target": "readmenator._mcp_server"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "glob"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "importlib.util"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_injector.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "time"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._cache"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._gitmeta"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._purpose"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._resolver"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_agent_output.py", "target": "readmenator._security"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "math"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "random"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_analyzer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._cache"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._cursorrules_generator"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._dead_code"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._gh_wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._linter"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._pipeline"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._query"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._refactorizer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._resolver"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._watcher"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_app.py", "target": "readmenator._video"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cache.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_category.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_category.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_category.py", "target": "enum"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_category.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_config.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_config.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_config.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cpg.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cpg.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cpg.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cpg.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cpg.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dataflow.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dead_code.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dead_code.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dead_code.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dead_code.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_dead_code.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "html"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_diagrams.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._cpg"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._mermaid"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._uml"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_documentation.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_explain.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_explain.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_explain.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_explain.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "math"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "textwrap"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_exporter.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "posixpath"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gh_wiki.py", "target": "readmenator._gitmeta"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gitmeta.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gitmeta.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_gitmeta.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_hotspots.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_hotspots.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_hotspots.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_hotspots.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_hotspots.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layer_rules.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layer_rules.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layer_rules.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layer_rules.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layers.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layers.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layers.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layers.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_layers.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_linter.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mcp_server.py", "target": "readmenator._query"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mermaid.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mermaid.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mermaid.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_mermaid.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_models.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_models.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_models.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_models.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._agent_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._agent_output"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._cpg"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._dataflow"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._documentation"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._exporter"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._gh_wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._hotspots"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._layer_rules"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._readme_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._rule_gen"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._sarif"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._scanner"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._security"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._taint"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._uml"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._video"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_pipeline.py", "target": "readmenator._wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_projections.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_projections.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_projections.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_projections.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_purpose.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_purpose.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_purpose.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_purpose.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_query.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rank.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rank.py", "target": "math"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rank.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rank.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rank.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_readme_injector.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_readme_injector.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_readme_injector.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_readme_injector.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_refactorizer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "posixpath"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_resolver.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_rule_gen.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_sarif.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_sarif.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_sarif.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_sarif.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_scanner.py", "target": "readmenator.parsers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_security.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_taint.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_taint.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_taint.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_taint.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_taint.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_uml.py", "target": "enum"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "colorsys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "math"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "multiprocessing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "networkx"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_video.py", "target": "PIL"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "time"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_watcher.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "time"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "collections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._purpose"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._purpose"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._purpose"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/_wiki.py", "target": "readmenator._security"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._c"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._python"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._go"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._rust"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._javascript"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._java"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._csharp"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._shell"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._php"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._dart"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._gdscript"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._nim"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._assembly"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._ruby"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._swift"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._kotlin"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._scala"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._lua"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator.parsers._elixir"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_assembly.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_assembly.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_assembly.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_assembly.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_base.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_base.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_base.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_base.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_base.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_c.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_c.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_c.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_c.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_csharp.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_csharp.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_csharp.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_csharp.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_dart.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_dart.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_dart.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_dart.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_elixir.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_elixir.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_elixir.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_elixir.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_gdscript.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_gdscript.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_gdscript.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_gdscript.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_go.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_go.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_go.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_go.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_java.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_java.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_java.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_java.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_javascript.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_javascript.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_javascript.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_javascript.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_kotlin.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_kotlin.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_kotlin.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_kotlin.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_lua.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_lua.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_lua.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_lua.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_nim.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_nim.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_nim.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_nim.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_php.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_php.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_php.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_php.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_python.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_python.py", "target": "ast"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_python.py", "target": "warnings"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_python.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_python.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_ruby.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_ruby.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_ruby.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_ruby.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_rust.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_rust.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_rust.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_rust.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_scala.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_scala.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_scala.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_scala.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_shell.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_shell.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_shell.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_shell.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_swift.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_swift.py", "target": "readmenator.parsers._base"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_swift.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator/parsers/_swift.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator.py", "target": "readmenator.__main__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "argparse"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "logging"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "shlex"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "datetime"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "readmenator_orchestrator.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._agent_output"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._gitmeta"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._layers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._purpose"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._resolver"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._scanner"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._cache"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "unittest.mock"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "readmenator._agent_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_injector.py", "target": "readmenator._agent_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "unittest.mock"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._agent_output"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._agent_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._agent_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._readme_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "readmenator._readme_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_agent_output.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_analyzer.py", "target": "readmenator._analyzer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "readmenator._cache"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cache.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_config.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_config.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_config.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "readmenator._cpg"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cpg.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "readmenator._cursorrules_generator"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_cursorrules.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "readmenator._dataflow"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dataflow.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dead_code.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dead_code.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dead_code.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dead_code.py", "target": "readmenator._dead_code"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_dead_code.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._diagrams"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_diagrams.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._documentation"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_documentation.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "readmenator._exporter"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_exporter.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "subprocess"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_gh_wiki.py", "target": "readmenator._gh_wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_hotspots.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_hotspots.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_hotspots.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_hotspots.py", "target": "readmenator._hotspots"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_hotspots.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_integration.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_layer_rules.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_layer_rules.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_layer_rules.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_layer_rules.py", "target": "readmenator._layer_rules"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_layer_rules.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_linter.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_linter.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_linter.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_linter.py", "target": "readmenator._linter"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_linter.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "readmenator._mcp_server"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mcp_server.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mermaid.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mermaid.py", "target": "readmenator._mermaid"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_mermaid.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_models.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_models.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers.py", "target": "readmenator.parsers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers.py", "target": "warnings"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_new.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_new.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_new.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_new.py", "target": "readmenator.parsers"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "sys"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._python"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._c"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._go"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._rust"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._javascript"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._java"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._csharp"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._shell"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._php"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._dart"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._gdscript"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._nim"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._ruby"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._swift"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._kotlin"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._scala"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._lua"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "readmenator.parsers._elixir"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_parsers_property.py", "target": "hypothesis"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_query.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_query.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_query.py", "target": "readmenator._query"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "pytest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "readmenator._category"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "readmenator._explain"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "readmenator._projections"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_ranking.py", "target": "readmenator._rank"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "readmenator._readme_injector"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_readme_injector.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._refactorizer"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_refactorizer.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_resolver.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_resolver.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_resolver.py", "target": "readmenator._resolver"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_rule_gen.py", "target": "readmenator._rule_gen"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_sarif.py", "target": "readmenator._sarif"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "readmenator._scanner"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "shutil"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_scanner.py", "target": "re"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_security.py", "target": "readmenator._security"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint.py", "target": "readmenator._taint"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "typing"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "readmenator._taint"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "pytest_bdd"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "readmenator._scanner"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "readmenator._resolver"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_taint_bdd.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_uml.py", "target": "__future__"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_uml.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_uml.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_uml.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_uml.py", "target": "readmenator._uml"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "readmenator._video"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "hashlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_video.py", "target": "readmenator._app"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "json"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "os"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "tempfile"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "unittest"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "pathlib"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._config"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "dataclasses"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._wiki"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._models"}, {"confidence": "EXTRACTED", "relation": "imports", "source": "tests/test_wiki.py", "target": "readmenator._wiki"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_mcp_server.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_readme_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__init__.py", "target": "readmenator/_uml.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__main__.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__main__.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/__main__.py", "target": "readmenator/_mcp_server.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_cache.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_gitmeta.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_purpose.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_resolver.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_agent_output.py", "target": "readmenator/_security.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_analyzer.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_analyzer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_cache.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_cursorrules_generator.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_dead_code.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_gh_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_linter.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_pipeline.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_query.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_refactorizer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_resolver.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_watcher.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_app.py", "target": "readmenator/_video.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_cache.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_cpg.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_cursorrules_generator.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_dataflow.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_dataflow.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_dead_code.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_dead_code.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_diagrams.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_diagrams.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_cpg.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_mermaid.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_uml.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_documentation.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_explain.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_explain.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_exporter.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_exporter.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_gh_wiki.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_gh_wiki.py", "target": "readmenator/_gitmeta.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_hotspots.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_hotspots.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_layer_rules.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_layer_rules.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_layers.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_linter.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_linter.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_linter.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mcp_server.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mcp_server.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mcp_server.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mcp_server.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mcp_server.py", "target": "readmenator/_query.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_mermaid.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_models.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_agent_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_agent_output.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_cpg.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_dataflow.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_documentation.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_exporter.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_gh_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_hotspots.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_layer_rules.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_readme_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_rule_gen.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_sarif.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_scanner.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_security.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_taint.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_uml.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_video.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_pipeline.py", "target": "readmenator/_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_projections.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_projections.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_purpose.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_query.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_query.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_query.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_rank.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_refactorizer.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_refactorizer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_resolver.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_rule_gen.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_rule_gen.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_sarif.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_scanner.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_scanner.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_scanner.py", "target": "readmenator/parsers/__init__.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_security.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_security.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_taint.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_taint.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_uml.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_uml.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_video.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_video.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_watcher.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_purpose.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_purpose.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_purpose.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/_wiki.py", "target": "readmenator/_security.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_c.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_python.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_go.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_rust.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_javascript.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_java.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_csharp.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_shell.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_php.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_dart.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_gdscript.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_nim.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_assembly.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_ruby.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_swift.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_kotlin.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_scala.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_lua.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/__init__.py", "target": "readmenator/parsers/_elixir.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_assembly.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_assembly.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_base.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_base.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_c.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_c.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_csharp.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_csharp.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_dart.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_dart.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_elixir.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_elixir.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_gdscript.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_gdscript.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_go.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_go.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_java.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_java.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_javascript.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_javascript.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_kotlin.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_kotlin.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_lua.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_lua.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_nim.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_nim.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_php.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_php.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_python.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_python.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_ruby.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_ruby.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_rust.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_rust.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_scala.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_scala.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_shell.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_shell.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_swift.py", "target": "readmenator/parsers/_base.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator/parsers/_swift.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "readmenator.py", "target": "readmenator/__main__.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_agent_output.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_gitmeta.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_layers.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_purpose.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_resolver.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_scanner.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_cache.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_friendliness.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_injector.py", "target": "readmenator/_agent_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_injector.py", "target": "readmenator/_agent_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_agent_output.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_agent_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_agent_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_readme_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_agent_output.py", "target": "readmenator/_readme_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_analyzer.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_analyzer.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_analyzer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_analyzer.py", "target": "readmenator/_analyzer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cache.py", "target": "readmenator/_cache.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cache.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_config.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cpg.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cpg.py", "target": "readmenator/_cpg.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cpg.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cursorrules.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cursorrules.py", "target": "readmenator/_cursorrules_generator.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_cursorrules.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dataflow.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dataflow.py", "target": "readmenator/_dataflow.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dataflow.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dataflow.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dataflow.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dead_code.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dead_code.py", "target": "readmenator/_dead_code.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_dead_code.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_diagrams.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_diagrams.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_documentation.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_documentation.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_exporter.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_exporter.py", "target": "readmenator/_exporter.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_exporter.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_gh_wiki.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_gh_wiki.py", "target": "readmenator/_gh_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_hotspots.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_hotspots.py", "target": "readmenator/_hotspots.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_hotspots.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_integration.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_integration.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_layer_rules.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_layer_rules.py", "target": "readmenator/_layer_rules.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_layer_rules.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_linter.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_linter.py", "target": "readmenator/_linter.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_linter.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_mcp_server.py", "target": "readmenator/_mcp_server.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_mcp_server.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_mcp_server.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_mermaid.py", "target": "readmenator/_mermaid.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_mermaid.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_models.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers.py", "target": "readmenator/parsers/__init__.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_new.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_new.py", "target": "readmenator/parsers/__init__.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_python.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_c.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_go.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_rust.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_javascript.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_java.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_csharp.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_shell.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_php.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_dart.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_gdscript.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_nim.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_ruby.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_swift.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_kotlin.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_scala.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_lua.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_parsers_property.py", "target": "readmenator/parsers/_elixir.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_query.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_query.py", "target": "readmenator/_query.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_ranking.py", "target": "readmenator/_category.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_ranking.py", "target": "readmenator/_explain.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_ranking.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_ranking.py", "target": "readmenator/_projections.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_ranking.py", "target": "readmenator/_rank.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_readme_injector.py", "target": "readmenator/_readme_injector.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_refactorizer.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_refactorizer.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_resolver.py", "target": "readmenator/_resolver.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_rule_gen.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_rule_gen.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_rule_gen.py", "target": "readmenator/_rule_gen.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_sarif.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_sarif.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_sarif.py", "target": "readmenator/_sarif.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_scanner.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_scanner.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_scanner.py", "target": "readmenator/_scanner.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_security.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_security.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_security.py", "target": "readmenator/_security.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint.py", "target": "readmenator/_taint.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint_bdd.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint_bdd.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint_bdd.py", "target": "readmenator/_taint.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint_bdd.py", "target": "readmenator/_scanner.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_taint_bdd.py", "target": "readmenator/_resolver.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_uml.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_uml.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_uml.py", "target": "readmenator/_uml.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_video.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_video.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_video.py", "target": "readmenator/_video.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_video.py", "target": "readmenator/_app.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_config.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_wiki.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_models.py"}, {"confidence": "EXTRACTED", "relation": "resolved_imports", "source": "tests/test_wiki.py", "target": "readmenator/_wiki.py"}], "generator": "readmenator", "metadata": {"edge_count": 12517, "file_count": 105, "language_count": 1, "symbol_count": 1852}, "nodes": [{"doc": "ReadMenator -- Zero-token polyglot codebase knowledge graph generator.  Public API: Config, Symbol, Node, Edge, EdgeKind, Morphism, Category, and readmenatorApplication provide the complete toolkit for generating, querying, ranking, and UML diagramming codebase knowledge graphs without any LLM calls or cloud dependencies.", "id": "readmenator/__init__.py", "kind": "module", "label": "__init__.py", "language": "py", "sha256": "693c306a8ca0b67d", "symbol_count": 0, "symbols": []}, {"doc": "Command line entry point: argument parsing and subcommand dispatch.", "id": "readmenator/__main__.py", "kind": "module", "label": "__main__.py", "language": "py", "sha256": "826dfe84833490c8", "symbol_count": 3, "symbols": [{"kind": "function", "line": 18, "name": "build_parser", "signature": "def build_parser()"}, {"kind": "function", "line": 121, "name": "_run_tests", "signature": "def _run_tests()"}, {"kind": "function", "line": 136, "name": "main", "signature": "def main()"}]}, {"doc": "Injects KNOWLEDGE_BASE.md references into AI agent instruction files.  Detects common AI agent configuration files (AGENTS.md, CLAUDE.md, .cursorrules, etc.) and appends a pointer to KNOWLEDGE_BASE.md so that agents can discover project context quickly without manual setup.  The injected text includes instructions for the agent to regenerate KNOWLEDGE_BASE.md by running readmenator when needed.", "id": "readmenator/_agent_injector.py", "kind": "module", "label": "_agent_injector.py", "language": "py", "sha256": "5def5d7a5f853501", "symbol_count": 14, "symbols": [{"doc": "Check if readmenator is installed via pip; install it if missing.\n\nReturns True if readmenator is available after the check.", "kind": "function", "line": 101, "name": "ensure_readmenator_installed", "signature": "def ensure_readmenator_installed()"}, {"doc": "Injects a link to KNOWLEDGE_BASE.md into AI agent instruction files.\n\nDetects common AI agent configuration files (AGENTS.md, CLAUDE.md,\n.cursorrules, etc.) and appends a descriptive section pointing to\nthe knowledge base so agents discover it automatically.\n\nThe injected text instructs the agent how to regenerate the KB\nby running readmenator when needed.", "kind": "class", "line": 123, "name": "AgentInjector", "signature": "class AgentInjector"}, {"kind": "method", "line": 134, "name": "__init__", "signature": "def __init__(self, kb_filename, agent_output_dir, agent_files, agent_globs, wiki_output_dir)"}, {"doc": "Inject KB reference into all discovered agent files.\n\nReturns the number of agent files actually modified.", "kind": "method", "line": 148, "name": "inject", "signature": "def inject(self, project_root)"}, {"doc": "Remove KB injection from all discovered agent files.\n\nReturns the number of files actually modified.", "kind": "method", "line": 166, "name": "remove", "signature": "def remove(self, project_root)"}, {"doc": "Public accessor: return all detected agent files.", "kind": "method", "line": 179, "name": "find_agent_files", "signature": "def find_agent_files(self, project_root)"}, {"kind": "method", "line": 183, "name": "_find_agent_files", "signature": "def _find_agent_files(self, root)"}, {"kind": "method", "line": 197, "name": "_inject_single", "signature": "def _inject_single(self, path)"}, {"kind": "method", "line": 235, "name": "_extract_current_injection", "signature": "def _extract_current_injection(content)"}, {"kind": "method", "line": 244, "name": "_remove_old_injection", "signature": "def _remove_old_injection(content)"}, {"kind": "method", "line": 254, "name": "_remove_single", "signature": "def _remove_single(self, path)"}, {"kind": "method", "line": 270, "name": "_build_injection", "signature": "def _build_injection(self, fmt)"}, {"doc": "Build Cursor .mdc injection body (frontmatter added separately).", "kind": "method", "line": 282, "name": "_build_mdc_injection", "signature": "def _build_mdc_injection(self)"}, {"doc": "Prepend Cursor frontmatter so the rule is auto-attached.", "kind": "method", "line": 287, "name": "_prepend_mdc_frontmatter", "signature": "def _prepend_mdc_frontmatter(content, injection)"}]}, {"doc": "Agent-friendly output generator for ReadMenator.  Generates grep-optimized, flat-markdown files in a dedicated output directory.  File names for per-subsystem files are **inferred** from the project's directory structure, never hardcoded.  The generated files are designed to be consumed by AI agents that perform ``grep`` / ``read`` operations and need queryable, small-context documents.  Every document is capped at ``AGENT_OUTPUT_MAX_LINES``: oversized documents are split on section boundaries into ``NAME.md``, ``NAME_p2.md``, ... with the table header repeated on each page, so a ``grep`` over ``NAME*.md`` still sees every line and a single read never blows an agent's context window.  Output layout::  readmenator-agent/ ├── MANIFEST.json         # freshness (git commit), read order, token costs ├── INDEX.md              # file -> purpose -> blast radius map ├── SYMBOLS.md            # one line per symbol ├── ARCHITECTURE.md       # dependency pairs (flat list) ├── SECURITY.md           # findings by severity ├── API.md                # public functions, one line each ├── GOTCHAS.md            # \"don't change X because Y\" ├── recipes/ │   └── *.md              # actionable task blocks └── KB_<subsystem>.md     # 1 file per inferred subsystem", "id": "readmenator/_agent_output.py", "kind": "module", "label": "_agent_output.py", "language": "py", "sha256": "8ecacdeef8281459", "symbol_count": 32, "symbols": [{"doc": "Generates agent-friendly, grep-optimised output files.\n\nAll output is plain Markdown -- no JSON wrapping, no fenced code\nblocks around data structures.  Every line is greppable.", "kind": "class", "line": 70, "name": "AgentOutputGenerator", "signature": "class AgentOutputGenerator"}, {"doc": "Store configuration for output paths and size budgets.", "kind": "method", "line": 77, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Write all agent output files and return the output directory path.", "kind": "method", "line": 81, "name": "generate", "signature": "def generate(self, nodes, edges, resolved_edges, analysis, analysis_v2, findings, layers, project_root)"}, {"doc": "Group nodes by directory, inferring subsystem names.", "kind": "method", "line": 137, "name": "_infer_subsystems", "signature": "def _infer_subsystems(self, nodes)"}, {"doc": "Build the file -> purpose -> subsystem -> blast radius table.", "kind": "method", "line": 172, "name": "_build_index", "signature": "def _build_index(self, nodes, subsystems, imported_by)"}, {"doc": "Build internal dependency pairs plus per-file external imports.\n\nExternal imports exclude raw import strings that resolved to a\nproject file, so internal modules are never listed twice.", "kind": "method", "line": 204, "name": "_build_architecture", "signature": "def _build_architecture(self, edges, resolved_edges, nodes)"}, {"doc": "Build findings grouped by severity with scope and fix hints.", "kind": "method", "line": 256, "name": "_build_security", "signature": "def _build_security(self, findings, nodes)"}, {"doc": "Return the nearest symbol defined at or before line.", "kind": "method", "line": 292, "name": "_enclosing_symbol", "signature": "def _enclosing_symbol(symbols, line)"}, {"doc": "Return whether a symbol belongs in the public API listing.", "kind": "method", "line": 302, "name": "_is_public", "signature": "def _is_public(self, sym)"}, {"doc": "Map each method's index to ``Owner.method`` using the nearest preceding type.", "kind": "method", "line": 309, "name": "_qualified_names", "signature": "def _qualified_names(symbols)"}, {"doc": "Build one greppable line per public function or method.\n\nDependencies and importers are stated once per file instead of\nonce per function, and test-layer files are skipped, which keeps\nthe listing an API reference rather than a symbol dump.", "kind": "method", "line": 327, "name": "_build_api", "signature": "def _build_api(self, nodes, resolved_map, imported_by, layers)"}, {"doc": "Build MANIFEST.json: freshness, entry points, read order, costs.\n\nThe project root is recorded relatively (never an absolute path),\nand the git commit lets agents detect a stale knowledge base with\none ``git rev-parse HEAD`` instead of re-reading everything.", "kind": "method", "line": 385, "name": "_build_manifest", "signature": "def _build_manifest(self, nodes, edges, resolved_edges, findings, project_root, subsystems, layers, out_dir)"}, {"doc": "Return likely program entry points, shallowest paths first.", "kind": "method", "line": 457, "name": "_entrypoints", "signature": "def _entrypoints(self, nodes, layers)"}, {"doc": "List generated documents with line counts and token estimates.", "kind": "method", "line": 468, "name": "_inventory", "signature": "def _inventory(self, out_dir)"}, {"doc": "Build grep-friendly symbol index (one line per symbol).", "kind": "method", "line": 481, "name": "_build_symbols", "signature": "def _build_symbols(self, nodes)"}, {"doc": "Render a cycle as a closed loop without duplicating a closed tail.", "kind": "method", "line": 496, "name": "_closed_loop", "signature": "def _closed_loop(cycle)"}, {"doc": "Build actionable warnings: blast radius, hotspots, cycles, violations.\n\nFiles in excluded layers (tests by default) are left out of the\ncentrality lists because their connectivity says nothing about\nthe risk of editing production code.", "kind": "method", "line": 503, "name": "_build_gotchas", "signature": "def _build_gotchas(self, analysis, analysis_v2, nodes, layers, imported_by)"}, {"doc": "Return a filesystem-safe subsystem name.", "kind": "method", "line": 626, "name": "_safe_name", "signature": "def _safe_name(name)"}, {"doc": "Write one paged KB_<subsystem>.md per inferred subsystem.", "kind": "method", "line": 633, "name": "_write_subsystem_files", "signature": "def _write_subsystem_files(self, out_dir, subsystems, resolved_map, imported_by, layers)"}, {"doc": "Build per-file context (purpose, layer, symbols, edges) for one subsystem.", "kind": "method", "line": 648, "name": "_build_subsystem_content", "signature": "def _build_subsystem_content(self, name, file_nodes, resolved_map, imported_by, layers)"}, {"doc": "Write task recipes grounded in this project's actual analysis data.", "kind": "method", "line": 698, "name": "_write_recipes", "signature": "def _write_recipes(self, recipes_dir, analysis, analysis_v2, findings, layers)"}, {"doc": "Index resolved dependencies by source file, sorted and deduplicated.", "kind": "method", "line": 826, "name": "_deps_by_source", "signature": "def _deps_by_source(resolved_map)"}, {"doc": "Map (source, target) pairs to their relation.", "kind": "method", "line": 836, "name": "_build_resolved_map", "signature": "def _build_resolved_map(resolved_edges)"}, {"doc": "Map each file to the files that import it.", "kind": "method", "line": 846, "name": "_build_imported_by_map", "signature": "def _build_imported_by_map(resolved_edges)"}, {"doc": "Return the file name of a page (page 1 keeps the original name).", "kind": "method", "line": 856, "name": "_page_name", "signature": "def _page_name(filename, page)"}, {"doc": "Split a document body into atomic units that should not straddle pages.", "kind": "method", "line": 864, "name": "_split_units", "signature": "def _split_units(body, is_table)"}, {"doc": "Split an oversized unit into budget-sized chunks with continued headings.", "kind": "method", "line": 877, "name": "_chunk_unit", "signature": "def _chunk_unit(unit, budget)"}, {"doc": "Split a document into pages that each respect the line cap.", "kind": "method", "line": 894, "name": "_paginate", "signature": "def _paginate(self, filename, content)"}, {"doc": "Write a document as one or more capped pages and return their paths.", "kind": "method", "line": 933, "name": "_write_paged", "signature": "def _write_paged(self, out_dir, filename, content)"}, {"doc": "Remove previously generated pages so renamed or shrunk docs leave no stale files.", "kind": "method", "line": 943, "name": "_prune_owned", "signature": "def _prune_owned(out_dir)"}, {"doc": "Write UTF-8 text content to a path.", "kind": "method", "line": 950, "name": "_write", "signature": "def _write(path, content)"}, {"doc": "Return whether a file belongs in the gotcha lists.", "kind": "method", "line": 522, "name": "keep", "signature": "def keep(file_id)"}]}, {"doc": "Graph analysis engine for the readmenator knowledge graph.  Provides community detection (Louvain-like greedy modularity), god node identification (degree/PageRank centrality), surprising connection discovery (cross-community bridges), and suggested exploration questions derived from graph structure. All operations are deterministic and token-free.", "id": "readmenator/_analyzer.py", "kind": "module", "label": "_analyzer.py", "language": "py", "sha256": "144a6cbe12268ae6", "symbol_count": 18, "symbols": [{"doc": "Return the most informative directory label for a set of files.\n\nHighest file count wins; ties prefer the longest (most specific)\ndirectory so that ``sandbox`` beats ``.``; remaining ties go\nalphabetical. ``\".\"`` is reported as ``\"root\"``.", "kind": "function", "line": 22, "name": "dominant_directory", "signature": "def dominant_directory(file_ids)"}, {"doc": "Deterministic graph analysis over scanned nodes and edges.\n\nBuilds an internal adjacency graph from import edges, then applies\ncommunity detection, centrality scoring, cross-community bridge\ndiscovery, and question generation without any external API calls.", "kind": "class", "line": 40, "name": "GraphAnalyzer", "signature": "class GraphAnalyzer"}, {"doc": "Initialise with application configuration.\n\nArgs:\n    config: Settings for thresholds and limits.", "kind": "method", "line": 48, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Run the full analysis pipeline and return structured results.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges from the scanner.\n    resolved_edges: Optional list of resolved-import edges (source and\n        target are both project file IDs).\n\nReturns:\n    An AnalysisResult with god nodes, communities, surprising\n    connections, and suggested questions.", "kind": "method", "line": 56, "name": "analyze", "signature": "def analyze(self, nodes, edges, resolved_edges)"}, {"doc": "Build an undirected adjacency map from import edges.", "kind": "method", "line": 109, "name": "_build_adjacency", "signature": "def _build_adjacency(self, nodes, edges)"}, {"doc": "Build a directed reverse adjacency (incoming edges) map.", "kind": "method", "line": 123, "name": "_build_reverse_adjacency", "signature": "def _build_reverse_adjacency(self, adjacency)"}, {"doc": "Compute the most central nodes using combined degree centrality.\n\nScore is a combination of out-degree (imports), in-degree (imported-by),\nand symbol count. Higher score means more architecturally significant.", "kind": "method", "line": 133, "name": "_compute_god_nodes", "signature": "def _compute_god_nodes(self, nodes, adjacency, reverse_adjacency)"}, {"doc": "Detect communities using label propagation.\n\nEach node adopts the label with the highest weighted vote among\nits neighbors. Iterates until convergence or max iterations reached.\nDeterministic: content-seeded order, sorted neighbors, min-label\ntie-break within COMMUNITY_VOTE_EPSILON.", "kind": "method", "line": 155, "name": "_detect_communities", "signature": "def _detect_communities(self, nodes, adjacency)"}, {"doc": "Fold communities smaller than COMMUNITY_MERGE_BELOW into their best neighbor.\n\nLabel propagation leaves many module-plus-test pairs; each would\nbecome its own wiki page. The smallest group first joins the\nneighboring community it shares the most vote weight with (ties\nto the lowest label). Isolated groups are kept unchanged.", "kind": "method", "line": 217, "name": "_merge_small_communities", "signature": "def _merge_small_communities(self, groups, adjacency, weights)"}, {"doc": "Return each node's label-propagation vote weight.\n\nWith COMMUNITY_HUB_DAMPING a neighbor votes with weight\n``1 / log2(2 + degree)``: hubs such as shared models or config,\nwhich nearly every file imports, stop pulling the whole project\ninto one giant community, while ordinary neighbors keep full say.", "kind": "method", "line": 264, "name": "_vote_weights", "signature": "def _vote_weights(self, file_ids, adjacency)"}, {"doc": "Generate human-readable labels for communities.\n\nLabels are based on the most common directory within the community.", "kind": "method", "line": 281, "name": "_label_communities", "signature": "def _label_communities(self, nodes, communities)"}, {"doc": "Return the stem of a community's most symbol-rich non-test file.\n\nUsed to tell apart communities that share a dominant directory,\nso labels read ``pkg: _video`` instead of an opaque number.", "kind": "method", "line": 308, "name": "_core_file", "signature": "def _core_file(members, node_map)"}, {"doc": "Build a reverse map from file ID to community ID.", "kind": "method", "line": 328, "name": "_build_community_map", "signature": "def _build_community_map(self, communities)"}, {"doc": "Compute cohesion score for each community.\n\nCohesion = internal edges / (internal edges + external edges).", "kind": "method", "line": 338, "name": "_compute_cohesion", "signature": "def _compute_cohesion(self, communities, adjacency)"}, {"doc": "Find non-obvious cross-community bridges.\n\nA connection is surprising when two nodes in different communities\nare connected indirectly through 3 or more hops, and the path\ncrosses community boundaries.", "kind": "method", "line": 363, "name": "_find_surprising_connections", "signature": "def _find_surprising_connections(self, nodes, adjacency, community_map)"}, {"doc": "Find the shortest path and communities traversed.", "kind": "method", "line": 403, "name": "_shortest_path_communities", "signature": "def _shortest_path_communities(self, source, target, adjacency, community_map)"}, {"doc": "Generate plain-language exploration questions from graph structure.", "kind": "method", "line": 430, "name": "_suggest_questions", "signature": "def _suggest_questions(self, nodes, god_nodes, communities, community_labels, surprising, adjacency)"}, {"doc": "Return whether a path looks like a test file.", "kind": "method", "line": 314, "name": "is_test", "signature": "def is_test(fid)"}]}, {"doc": "Application orchestrator: scan, resolve, analyze, and write every output.  Thin facade over AnalyzerFactory that wires the scanner, analyzers, and generators into the run, rebuild, update, query, and export commands.", "id": "readmenator/_app.py", "kind": "module", "label": "_app.py", "language": "py", "sha256": "5b4058a7a430c3f2", "symbol_count": 50, "symbols": [{"kind": "class", "line": 43, "name": "readmenatorApplication", "signature": "class readmenatorApplication"}, {"kind": "method", "line": 44, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 53, "name": "_scan", "signature": "def _scan(self, target_dir)"}, {"kind": "method", "line": 61, "name": "_scan_with_content", "signature": "def _scan_with_content(self, target_dir)"}, {"kind": "method", "line": 71, "name": "_resolve_imports", "signature": "def _resolve_imports(self, nodes, edges, target_dir)"}, {"kind": "method", "line": 90, "name": "run", "signature": "def run(self, target_dir, resolve_imports, run_analysis, run_security, run_v2_analysis)"}, {"doc": "Compare the MANIFEST source fingerprint against the current sources.\n\nArgs:\n    target_dir: Project root directory.\n\nReturns:\n    Tuple of (fresh, human-readable reason).", "kind": "method", "line": 214, "name": "check_freshness", "signature": "def check_freshness(self, target_dir)"}, {"doc": "Refresh the static docs site when a previous ``pages`` run created it.\n\nThe site directory is only rewritten when it already holds a\nreadmenator gallery (index plus maps subdirectory), so a user's own\ndocs folder is never taken over by a plain rebuild.", "kind": "method", "line": 241, "name": "_maybe_refresh_pages", "signature": "def _maybe_refresh_pages(self, root)"}, {"doc": "Publish generated docs to the GitHub wiki when GH_WIKI_ENABLED is set.", "kind": "method", "line": 259, "name": "_maybe_publish_github_wiki", "signature": "def _maybe_publish_github_wiki(self, root)"}, {"doc": "Mirror the generated wiki, agent docs, and knowledge base to the GitHub wiki.\n\nArgs:\n    target_dir: Project root directory with generated outputs.\n    dry_run: Render pages into GH_WIKI_DRY_RUN_DIR without git calls.\n\nReturns:\n    WikiPublishResult with pages written and push status.", "kind": "method", "line": 265, "name": "publish_github_wiki", "signature": "def publish_github_wiki(self, target_dir, dry_run)"}, {"kind": "method", "line": 279, "name": "_write_sidecar_outputs", "signature": "def _write_sidecar_outputs(self, root, findings, analysis_v2)"}, {"kind": "method", "line": 305, "name": "_inject_readme_link", "signature": "def _inject_readme_link(self, root)"}, {"kind": "method", "line": 313, "name": "_inject_agent_files", "signature": "def _inject_agent_files(self, root)"}, {"kind": "method", "line": 321, "name": "generate_uml_code", "signature": "def generate_uml_code(self, target_dir, language, output_path)"}, {"kind": "method", "line": 333, "name": "_log_summary", "signature": "def _log_summary(self, nodes, edges, root, resolved_edges, analysis, layer_summary, analysis_v2, findings)"}, {"kind": "method", "line": 388, "name": "update", "signature": "def update(self, target_dir, run_security)"}, {"kind": "method", "line": 493, "name": "_scan_for_cache", "signature": "def _scan_for_cache(self, root, cache)"}, {"kind": "method", "line": 511, "name": "query", "signature": "def query(self, target_dir, question)"}, {"kind": "method", "line": 516, "name": "explain", "signature": "def explain(self, target_dir, symbol_name)"}, {"kind": "method", "line": 528, "name": "find_path", "signature": "def find_path(self, target_dir, symbol_a, symbol_b)"}, {"kind": "method", "line": 541, "name": "summary", "signature": "def summary(self, target_dir)"}, {"doc": "Run a ranked query against the knowledge graph.\n\nUses Personalized PageRank seeded from query terms to produce\na relevance-ranked list of files with score decomposition.\n\nArgs:\n    target_dir: Project root directory.\n    query: Free-text query.\n    top_n: Number of results.\n\nReturns:\n    A RankedResult with scored items.", "kind": "method", "line": 546, "name": "rank_query", "signature": "def rank_query(self, target_dir, query, top_n)"}, {"kind": "method", "line": 576, "name": "rebuild", "signature": "def rebuild(self, target_dir, run_security)"}, {"kind": "method", "line": 579, "name": "analyze", "signature": "def analyze(self, target_dir)"}, {"kind": "method", "line": 583, "name": "export_json", "signature": "def export_json(self, target_dir, output_path)"}, {"kind": "method", "line": 594, "name": "export_html", "signature": "def export_html(self, target_dir, output_path)"}, {"kind": "method", "line": 605, "name": "export_svg", "signature": "def export_svg(self, target_dir, output_path)"}, {"kind": "method", "line": 616, "name": "export", "signature": "def export(self, target_dir)"}, {"kind": "method", "line": 621, "name": "export_graphml", "signature": "def export_graphml(self, target_dir, output_path)"}, {"kind": "method", "line": 632, "name": "export_cypher", "signature": "def export_cypher(self, target_dir, output_path)"}, {"kind": "method", "line": 645, "name": "export_obsidian", "signature": "def export_obsidian(self, target_dir, output_dir)"}, {"doc": "Generate the navigable agent wiki for the target project.\n\nArgs:\n    target_dir: Project root directory.\n    output_dir: Optional override for the wiki output directory.\n\nReturns:\n    Path of the wiki directory that was written.", "kind": "method", "line": 655, "name": "export_wiki", "signature": "def export_wiki(self, target_dir, output_dir)"}, {"doc": "Check wiki health and log reported issues.\n\nArgs:\n    target_dir: Project root directory.\n\nReturns:\n    List of issue descriptions, empty when healthy.", "kind": "method", "line": 678, "name": "lint_wiki", "signature": "def lint_wiki(self, target_dir)"}, {"doc": "Export all five interactive system maps plus a gallery index.\n\nArgs:\n    target_dir: Project root directory.\n    output_dir: Destination directory for map files.\n    full: True includes every file with a grown canvas, False truncates.\n\nReturns:\n    Mapping of diagram kind to written file path.", "kind": "method", "line": 696, "name": "export_diagrams", "signature": "def export_diagrams(self, target_dir, output_dir, full)"}, {"doc": "Return the configured map renderer for published output.\n\nReturns:\n    The vis.js renderer when enabled, else the offline renderer.", "kind": "method", "line": 738, "name": "_live_renderer", "signature": "def _live_renderer(self)"}, {"doc": "Export a single interactive system map as standalone HTML.\n\nArgs:\n    target_dir: Project root directory.\n    kind: Diagram kind identifier.\n    output_path: Destination file path.\n    full: True includes every file with a grown canvas, False truncates.\n\nReturns:\n    Rendered HTML document that was written.", "kind": "method", "line": 748, "name": "export_diagram", "signature": "def export_diagram(self, target_dir, kind, output_path, full)"}, {"doc": "Publish all system maps plus a gallery index as a static site.\n\nArgs:\n    target_dir: Project root directory.\n    output_dir: Destination directory for the static site.\n    full: True includes every file with a grown canvas, False truncates.\n\nReturns:\n    Mapping of published page identifier to written file path.", "kind": "method", "line": 787, "name": "export_pages", "signature": "def export_pages(self, target_dir, output_dir, full)"}, {"doc": "Render the cinematic overview video for the target project.\n\nArgs:\n    target_dir: Project root directory.\n    output_path: Destination mp4 path.\n\nReturns:\n    Written file path, or None when video is disabled or skipped.", "kind": "method", "line": 826, "name": "export_video", "signature": "def export_video(self, target_dir, output_path)"}, {"doc": "Render video when enabled, skipping gracefully without deps.", "kind": "method", "line": 850, "name": "_maybe_export_video", "signature": "def _maybe_export_video(self, root, nodes, edges, resolved_edges, analysis, layers, findings, analysis_v2, content_map, output_path)"}, {"kind": "method", "line": 890, "name": "watch", "signature": "def watch(self, target_dir)"}, {"kind": "method", "line": 900, "name": "audit", "signature": "def audit(self, target_dir)"}, {"kind": "method", "line": 907, "name": "audit_deep", "signature": "def audit_deep(self, target_dir)"}, {"kind": "method", "line": 927, "name": "export_sarif", "signature": "def export_sarif(self, target_dir, output_path)"}, {"kind": "method", "line": 937, "name": "export_rules", "signature": "def export_rules(self, target_dir, output_dir)"}, {"kind": "method", "line": 947, "name": "detect_layers", "signature": "def detect_layers(self, target_dir)"}, {"kind": "method", "line": 957, "name": "lint", "signature": "def lint(self, target_dir)"}, {"kind": "method", "line": 970, "name": "strip_dead_code", "signature": "def strip_dead_code(self, target_dir)"}, {"kind": "method", "line": 980, "name": "generate_cursorrules", "signature": "def generate_cursorrules(self, target_dir)"}, {"kind": "method", "line": 995, "name": "refactor_monolith", "signature": "def refactor_monolith(self, target_dir)"}, {"kind": "method", "line": 894, "name": "on_change", "signature": "def on_change()"}]}, {"doc": "File-content hash cache for incremental scanning and analysis caching.  Computes SHA256 digests of file contents and persists them to disk so that subsequent scans can skip unchanged files. Also supports caching of analysis results (security findings, v2 analysis, etc.) for faster incremental rebuilds.", "id": "readmenator/_cache.py", "kind": "module", "label": "_cache.py", "language": "py", "sha256": "1a09ce2729ffe307", "symbol_count": 14, "symbols": [{"doc": "SHA256-based cache for incremental file scanning and analysis.\n\nStores a JSON mapping of relative file paths to their content\nhashes inside the project's cache directory. On subsequent runs,\nfiles whose hash matches the cached value are skipped.\n\nAlso caches analysis results so that unchanged files reuse\npreviously-computed security findings, taint paths, etc.", "kind": "class", "line": 20, "name": "FileCache", "signature": "class FileCache"}, {"doc": "Return one SHA256 over the sorted paths and contents of scanned sources.\n\nGenerated documents embed this value; recomputing it later answers\n\"do the docs still describe these sources?\" exactly, independent of\ngit commits (docs generated before a commit stay fresh after it).\n\nArgs:\n    project_root: Project root directory.\n    file_ids: Project-relative source paths that were scanned.\n\nReturns:\n    Hex digest; missing, unreadable, or symlinked files hash as empty.", "kind": "method", "line": 179, "name": "source_fingerprint", "signature": "def source_fingerprint(project_root, file_ids)"}, {"kind": "method", "line": 31, "name": "__init__", "signature": "def __init__(self, config, project_root)"}, {"kind": "method", "line": 38, "name": "load", "signature": "def load(self)"}, {"kind": "method", "line": 49, "name": "save", "signature": "def save(self, hashes)"}, {"kind": "method", "line": 55, "name": "compute_hash", "signature": "def compute_hash(self, file_path)"}, {"kind": "method", "line": 64, "name": "compute_hashes", "signature": "def compute_hashes(self, file_paths)"}, {"kind": "method", "line": 72, "name": "find_changed", "signature": "def find_changed(self, file_paths)"}, {"kind": "method", "line": 84, "name": "prune_deleted", "signature": "def prune_deleted(self, current_file_ids)"}, {"doc": "Save an analysis result to the semantic cache.\n\nArgs:\n    key: Cache key (e.g. \"security\", \"analysis_v2\", \"taint\").\n    data: Serializable analysis data.", "kind": "method", "line": 95, "name": "save_analysis", "signature": "def save_analysis(self, key, data)"}, {"doc": "Load a previously cached analysis result.\n\nArgs:\n    key: Cache key.\n\nReturns:\n    Cached data dict, or None if not found or expired.", "kind": "method", "line": 118, "name": "load_analysis", "signature": "def load_analysis(self, key)"}, {"doc": "Clear analysis cache, optionally for a specific key only.\n\nArgs:\n    key: If given, only clears this key. Otherwise clears all.", "kind": "method", "line": 135, "name": "clear_analysis", "signature": "def clear_analysis(self, key)"}, {"doc": "Remove analysis entries for files that no longer exist.", "kind": "method", "line": 155, "name": "_prune_analysis_cache", "signature": "def _prune_analysis_cache(self, current_file_ids)"}, {"doc": "Check if any file has changed since the last analysis cache.\n\nReturns True if there are no cached hashes (first run) or if\nany file hash differs from the cached value.", "kind": "method", "line": 166, "name": "has_changed_since_last_analysis", "signature": "def has_changed_since_last_analysis(self, file_paths)"}]}, {"doc": "Category theory model for the readmenator code graph.  Defines typed morphisms (edges with semantic kind), objects (file nodes), and a Category class for algebraic path composition. Every edge in the knowledge graph carries an EdgeKind that survives through to ranking computations.  The gain from category theory is that ReadMenator can answer queries by transformation, not just proximity:  - \"What code implements this concept?\"  -> documents -> defines - \"What breaks if I change this node?\"  -> composition of reverse edges - \"What tests validate this abstraction?\" -> defines <- tests - \"How do I get from public API to impl?\" -> composite paths", "id": "readmenator/_category.py", "kind": "module", "label": "_category.py", "language": "py", "sha256": "af20c924da229812", "symbol_count": 26, "symbols": [{"doc": "Semantic type of a morphism between two code artifacts.", "kind": "class", "line": 24, "name": "EdgeKind", "signature": "class EdgeKind(str, Enum)"}, {"doc": "A typed directed edge between two code artifacts.\n\nAttributes:\n    source: Node ID of the source artifact.\n    target: Node ID of the target artifact.\n    kind: Semantic type of the relationship.\n    confidence: Confidence score from static analysis (0.0 to 1.0).", "kind": "class", "line": 57, "name": "Morphism", "signature": "class Morphism"}, {"doc": "A category of code artifacts with typed morphisms.\n\nObjects are node IDs (file paths or symbol identifiers).\nMorphisms are typed directed edges. Composition follows\ncompatible source/target chains respecting edge-kind semantics.", "kind": "class", "line": 78, "name": "Category", "signature": "class Category"}, {"doc": "Weighted directed graph for PageRank computations.\n\nConverts a Category into a stochastic transition matrix suitable\nfor eigenvalue computation, preserving edge kind weights.", "kind": "class", "line": 181, "name": "TypedGraph", "signature": "class TypedGraph"}, {"doc": "Build a Category from lists of Edge objects.\n\nMaps Edge.relation strings to EdgeKind where possible.\nUnrecognised relation strings are mapped to DEPENDS_ON.\n\nArgs:\n    edges: Raw import edges from the scanner.\n    resolved_edges: Optional resolved-import edges.\n    node_ids: Optional set of valid node IDs to include.\n\nReturns:\n    A populated Category instance.", "kind": "method", "line": 236, "name": "build_category_from_edges", "signature": "def build_category_from_edges(edges, resolved_edges, node_ids)"}, {"doc": "Map a relation string to an EdgeKind.\n\nFalls back to DEPENDS_ON for unrecognised strings.", "kind": "method", "line": 278, "name": "_infer_edge_kind", "signature": "def _infer_edge_kind(relation)"}, {"kind": "method", "line": 38, "name": "__str__", "signature": "def __str__(self)"}, {"doc": "Effective weight for ranking = semantic weight * confidence.", "kind": "method", "line": 73, "name": "weight", "signature": "def weight(self)"}, {"kind": "method", "line": 86, "name": "__init__", "signature": "def __init__(self)"}, {"kind": "method", "line": 92, "name": "add_object", "signature": "def add_object(self, obj_id)"}, {"kind": "method", "line": 95, "name": "add_morphism", "signature": "def add_morphism(self, m)"}, {"kind": "method", "line": 103, "name": "objects", "signature": "def objects(self)"}, {"kind": "method", "line": 107, "name": "morphisms", "signature": "def morphisms(self)"}, {"kind": "method", "line": 110, "name": "outgoing", "signature": "def outgoing(self, obj_id)"}, {"kind": "method", "line": 113, "name": "incoming", "signature": "def incoming(self, obj_id)"}, {"doc": "Compose two morphisms if target of a matches source of b.\n\nReturns a new Morphism with composite kind, or None if\nthe kinds are incompatible.", "kind": "method", "line": 116, "name": "compose", "signature": "def compose(self, a, b)"}, {"doc": "Find all composition paths from source to target up to max_depth.", "kind": "method", "line": 133, "name": "paths", "signature": "def paths(self, source, target, max_depth)"}, {"doc": "Determine the composite edge kind.\n\nComposition rules:\n- imports + defines -> defines (reachable definition)\n- imports + calls -> calls (reachable call)\n- defines + tests -> tests (tested through definition)\n- documents + defines -> documents (documented definition)\n- Same kind -> same kind.\n- Other combinations -> None (incompatible).", "kind": "method", "line": 157, "name": "_compose_kind", "signature": "def _compose_kind(a, b)"}, {"kind": "method", "line": 188, "name": "__init__", "signature": "def __init__(self, category)"}, {"kind": "method", "line": 197, "name": "_compute_out_weights", "signature": "def _compute_out_weights(self)"}, {"kind": "method", "line": 203, "name": "nodes", "signature": "def nodes(self)"}, {"kind": "method", "line": 207, "name": "size", "signature": "def size(self)"}, {"kind": "method", "line": 210, "name": "node_index", "signature": "def node_index(self, node_id)"}, {"doc": "Sum of weights of all morphisms from source to target.", "kind": "method", "line": 213, "name": "transition_weight", "signature": "def transition_weight(self, source, target)"}, {"doc": "Return dict of target -> probability for the row of *source*.\n\nProbabilities sum to 1.0 if source has outgoing edges.\nReturns empty dict for dangling nodes.", "kind": "method", "line": 221, "name": "stochastic_row", "signature": "def stochastic_row(self, source)"}, {"kind": "method", "line": 139, "name": "dfs", "signature": "def dfs(current, goal, path, depth)"}]}, {"doc": "Immutable configuration dataclass for readmenator.  All tuneable parameters live here as frozen dataclass fields. No magic numbers or hardcoded paths exist elsewhere in the codebase. Derived consumers import Config and read values from an instance.", "id": "readmenator/_config.py", "kind": "module", "label": "_config.py", "language": "py", "sha256": "a5ac9a21b5bd0467", "symbol_count": 1, "symbols": [{"doc": "Single source of truth for all readmenator settings.\n\nEvery tuneable constant -- file-size limits, directory depth,\nsupported extensions, symbol pluralisation map, Mermaid style\ntokens, graph analysis thresholds, and export settings -- is\ndefined here and consumed by reference elsewhere.", "kind": "class", "line": 15, "name": "Config", "signature": "class Config"}]}, {"doc": "Code Property Graph (CPG) generator emitting JSON-LD for AI agents.  Merges symbols, call, import, and inheritance edges, content hashes, and optional analysis metadata into one embeddable, zero-token graph.", "id": "readmenator/_cpg.py", "kind": "module", "label": "_cpg.py", "language": "py", "sha256": "8a900bfd31ac5121", "symbol_count": 6, "symbols": [{"doc": "Generates a Code Property Graph (CPG) as JSON-LD for AI agent consumption.\n\nProduces a structured representation merging AST-level symbol data,\ncontrol-flow edges (calls), data-flow edges (imports), inheritance\nrelationships, and security findings (with MITRE ATT&CK mappings)\ninto a single machine-readable document. Designed to be embedded in\nKNOWLEDGE_BASE.md for zero-token agent context.", "kind": "class", "line": 16, "name": "CodePropertyGraph", "signature": "class CodePropertyGraph"}, {"kind": "method", "line": 26, "name": "__init__", "signature": "def __init__(self, privacy_mode, cpg_context)"}, {"doc": "Generate the CPG JSON-LD string embeddable in markdown.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for metadata.\n    findings: Optional security findings with MITRE ATT&CK IDs.\n\nReturns:\n    Compact JSON-LD string with @context, nodes, edges, analysis,\n    and mitre_attack metadata.", "kind": "method", "line": 30, "name": "generate", "signature": "def generate(self, nodes, edges, resolved_edges, analysis, findings)"}, {"kind": "method", "line": 147, "name": "_severity_counts", "signature": "def _severity_counts(self, findings)"}, {"kind": "method", "line": 153, "name": "_build_symbol_list", "signature": "def _build_symbol_list(self, node)"}, {"kind": "method", "line": 169, "name": "_compute_node_hash", "signature": "def _compute_node_hash(node)"}]}, {"doc": "Dynamic .cursorrules generator for the readmenator knowledge graph.  Reads architectural analysis results and linter violations to produce a deterministic .cursorrules file that feeds structural constraints back into AI coding assistants.", "id": "readmenator/_cursorrules_generator.py", "kind": "module", "label": "_cursorrules_generator.py", "language": "py", "sha256": "df7fb514feb68f04", "symbol_count": 8, "symbols": [{"doc": "Generates a .cursorrules file from architectural analysis.\n\nCombines base rules, detected layer constraints, and active\nlinter violations into a deterministic ruleset for AI assistants.", "kind": "class", "line": 18, "name": "CursorRulesGenerator", "signature": "class CursorRulesGenerator"}, {"kind": "method", "line": 25, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Generate the .cursorrules content string.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    analysis: Optional analysis results.\n    layers: Optional layer mapping.\n    violations: Optional linter violations.\n    project_root: Optional project root for file output.\n\nReturns:\n    The generated .cursorrules content as a string.", "kind": "method", "line": 28, "name": "generate", "signature": "def generate(self, nodes, edges, analysis, layers, violations, project_root)"}, {"kind": "method", "line": 63, "name": "_build_base_rules", "signature": "def _build_base_rules(self)"}, {"kind": "method", "line": 81, "name": "_extract_layer_constraints", "signature": "def _extract_layer_constraints(self, layers)"}, {"kind": "method", "line": 92, "name": "_extract_analysis_constraints", "signature": "def _extract_analysis_constraints(self, analysis)"}, {"kind": "method", "line": 107, "name": "_extract_violation_rules", "signature": "def _extract_violation_rules(self, violations)"}, {"kind": "method", "line": 115, "name": "_write_file", "signature": "def _write_file(self, project_root, content)"}]}, {"doc": "Procedural intra-function dataflow analysis for readmenator.  Detects classic logic bug classes without tokens, types, or control-flow graphs: use of uninitialized locals, dead stores (assigned but never read), and unchecked allocator results. Pure regex over function body spans derived from parsed symbol line ranges. Every finding is marked INFERRED: heuristics trade recall for reviewable, line-grounded leads.", "id": "readmenator/_dataflow.py", "kind": "module", "label": "_dataflow.py", "language": "py", "sha256": "83f0c71512dcaffa", "symbol_count": 21, "symbols": [{"doc": "Remove comments and string contents that confuse identifier scans.\n\nStrings are blanked before comment stripping so that ``//`` inside\nURL literals is not mistaken for a comment opener.", "kind": "function", "line": 96, "name": "_strip_noise", "signature": "def _strip_noise(line)"}, {"doc": "Blank block comments while preserving newlines and line numbers.", "kind": "function", "line": 107, "name": "_strip_block_comments", "signature": "def _strip_block_comments(content)"}, {"doc": "Blank sizeof operands, which never evaluate their argument at runtime.", "kind": "function", "line": 116, "name": "_strip_sizeof", "signature": "def _strip_sizeof(line)"}, {"doc": "Regex-based intra-function dataflow checker over scanned content.", "kind": "class", "line": 122, "name": "DataflowAnalyzer", "signature": "class DataflowAnalyzer"}, {"kind": "method", "line": 110, "name": "_blank", "signature": "def _blank(match)"}, {"doc": "Store configuration for enable flag and issue caps.", "kind": "method", "line": 125, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Check every function body span and return capped issues.", "kind": "method", "line": 129, "name": "analyze", "signature": "def analyze(self, nodes, content_map)"}, {"doc": "Return the brace depth before each line of noise-stripped code.", "kind": "method", "line": 153, "name": "_brace_depths", "signature": "def _brace_depths(lines)"}, {"doc": "Return (name, start_idx, end_idx) spans for function symbols.\n\nOnly function lines and file-scope (depth 0) symbols terminate a\nspan; local struct, enum, or variable declarations inside a body\ndo not truncate the enclosing function.", "kind": "method", "line": 164, "name": "_function_spans", "signature": "def _function_spans(self, node, total_lines, depths)"}, {"doc": "Run def-use checks over one function body span.", "kind": "method", "line": 191, "name": "_analyze_function", "signature": "def _analyze_function(self, file_id, func, lines, start, end)"}, {"doc": "Record identifier reads and address-takes inside an expression.", "kind": "method", "line": 403, "name": "_scan_reads", "signature": "def _scan_reads(text, lineno, reads, assigned, declared_names)"}, {"doc": "Discover pointer-from-array aliases in mid-line statements.", "kind": "method", "line": 427, "name": "_scan_inline_aliases", "signature": "def _scan_inline_aliases(line, lineno, arrays, derived_alias, deriv_reads)"}, {"doc": "Treat known filler/scan call arguments as assignments.", "kind": "method", "line": 450, "name": "_scan_out_params", "signature": "def _scan_out_params(line, lineno, assigned)"}, {"doc": "Treat arrays passed to non-readonly calls as assignments.", "kind": "method", "line": 461, "name": "_scan_array_args", "signature": "def _scan_array_args(line, lineno, arrays, assigned)"}, {"doc": "Extract parameter names from a function signature line.", "kind": "method", "line": 474, "name": "_params_of", "signature": "def _params_of(signature_line)"}, {"doc": "Track whether the next line continues an unclosed call.", "kind": "method", "line": 494, "name": "_track_call_continuation", "signature": "def _track_call_continuation(line, call_open, paren_balance)"}, {"doc": "Return True when an expression mentions a function parameter.", "kind": "method", "line": 513, "name": "_mentions_param", "signature": "def _mentions_param(text, params)"}, {"doc": "Return True when the identifier at pos is a struct member access.", "kind": "method", "line": 521, "name": "_is_member", "signature": "def _is_member(line, pos)"}, {"doc": "Return the base identifier of a member access chain.", "kind": "method", "line": 527, "name": "_member_base", "signature": "def _member_base(line, pos)"}, {"doc": "Return True for declaration lines that are actually prototypes.", "kind": "method", "line": 535, "name": "_is_prototype", "signature": "def _is_prototype(line)"}, {"doc": "Return True when body contains a NULL/boolean check for name.", "kind": "method", "line": 540, "name": "_null_checked", "signature": "def _null_checked(body_text, name)"}]}, {"doc": "Dead code detection for the readmenator knowledge graph.  Identifies orphaned symbols with zero in-degree in the resolved import graph, excluding known entry points. Generates structured reports without auto-deleting any code.", "id": "readmenator/_dead_code.py", "kind": "module", "label": "_dead_code.py", "language": "py", "sha256": "9606c78ecbfacbd6", "symbol_count": 5, "symbols": [{"doc": "Identifies dead code symbols in the knowledge graph.\n\nBuilds an in-degree map from resolved import edges, then flags\nsymbols that are never imported by any other file. Known entry\npoints are excluded from the dead code report.", "kind": "class", "line": 17, "name": "DeadCodeStripper", "signature": "class DeadCodeStripper"}, {"kind": "method", "line": 25, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Identify dead code symbols with zero in-degree.\n\nArgs:\n    nodes: Scanned file nodes with symbols.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n\nReturns:\n    List of DeadCodeReport instances for orphaned symbols.", "kind": "method", "line": 28, "name": "identify", "signature": "def identify(self, nodes, edges, resolved_edges)"}, {"doc": "Build in-degree count for each symbol name.", "kind": "method", "line": 64, "name": "_build_in_degree_map", "signature": "def _build_in_degree_map(self, nodes, resolved_edges)"}, {"doc": "Classify the recommended action for a dead symbol.", "kind": "method", "line": 88, "name": "_classify_recommendation", "signature": "def _classify_recommendation(self, symbol)"}]}, {"doc": "Self-contained interactive system maps for the knowledge graph.  Builds typed intermediate representations for five diagram kinds (architecture, workflow, sequence, dataflow, lifecycle) from scanned nodes and edges, validates each map deterministically, and renders a single self-contained HTML document with inline SVG, search, focus, reach tracing, route probing, role comparison, guided views, presentation stage, themes, presets, keyboard access, deep links, finite motion, and client-side export.", "id": "readmenator/_diagrams.py", "kind": "module", "label": "_diagrams.py", "language": "py", "sha256": "890ab4c64275f3b4", "symbol_count": 79, "symbols": [{"doc": "Escape text for HTML and tooltip embedding.\n\nArgs:\n    value: Raw text.\n\nReturns:\n    Escaped text safe for markup contexts.", "kind": "function", "line": 24, "name": "_escape_markup", "signature": "def _escape_markup(value)"}, {"doc": "Serialize a payload for safe inline script embedding.\n\nArgs:\n    payload: JSON-serializable payload.\n\nReturns:\n    JSON text with angle brackets unicode-escaped.", "kind": "function", "line": 36, "name": "_json_payload", "signature": "def _json_payload(payload)"}, {"doc": "Return the stroke color for a semantic role.\n\nArgs:\n    role: Semantic role identifier.\n    config: Central settings holding the role palette.\n\nReturns:\n    Hex color string for the role.", "kind": "function", "line": 48, "name": "_role_color", "signature": "def _role_color(role, config)"}, {"doc": "Single authored node in a system map.\n\nAttributes:\n    node_id: Stable identifier derived from the file path.\n    label: Short display label.\n    role: Semantic role used for color and lens comparison.\n    group: Lane or layer grouping used for layout.\n    detail: Supporting detail shown in the passport panel.\n    x: Deterministic horizontal canvas coordinate.\n    y: Deterministic vertical canvas coordinate.\n    language: Programming language of the source file.\n    doc: File-level documentation string.\n    symbols: Symbol records with name, kind, line, signature, doc.\n    symbol_total: Total symbol count before per-node truncation.", "kind": "class", "line": 62, "name": "MapNode", "signature": "class MapNode"}, {"doc": "Single authored directed relationship in a system map.\n\nAttributes:\n    source: Source node identifier.\n    target: Target node identifier.\n    label: Semantic relationship label.\n    kind: Relationship kind used for styling.", "kind": "class", "line": 93, "name": "MapEdge", "signature": "class MapEdge"}, {"doc": "Single guided chapter over authored topology.\n\nAttributes:\n    view_id: Stable chapter identifier usable in deep links.\n    title: Chapter title.\n    focus: Ordered node identifiers highlighted by the chapter.\n    description: Supporting explanation for the chapter.", "kind": "class", "line": 110, "name": "MapView", "signature": "class MapView"}, {"doc": "Typed intermediate representation of one diagram.\n\nAttributes:\n    kind: Diagram kind identifier.\n    title: Human-readable diagram title.\n    nodes: Authored nodes with deterministic coordinates.\n    edges: Authored directed relationships.\n    views: Guided chapters over the topology.\n    meta: Generation metadata for receipts and exports.", "kind": "class", "line": 127, "name": "SystemMap", "signature": "class SystemMap"}, {"doc": "Single machine-readable validation diagnostic.\n\nAttributes:\n    rule: Stable rule code.\n    subject: Identifier of the offending subject.\n    evidence: Measured evidence describing the failure.\n    repair: Supported repair control for the failure.", "kind": "class", "line": 148, "name": "MapDiagnostic", "signature": "class MapDiagnostic"}, {"doc": "Deterministic validation receipt for a system map.\n\nAttributes:\n    passed: True when zero errors were found.\n    checks: Names of checks that were executed.\n    errors: Error diagnostics blocking delivery.\n    warnings: Non-blocking advisory diagnostics.", "kind": "class", "line": 165, "name": "MapReceipt", "signature": "class MapReceipt"}, {"doc": "Before and after comparison between two maps of the same kind.\n\nAttributes:\n    kind: Diagram kind that was compared.\n    added: Node identifiers present only in the head map.\n    removed: Node identifiers present only in the base map.\n    changed: Node identifiers with altered role, group, or label.\n    moved: Node identifiers with altered coordinates.\n    rerouted: Edge pairs present only in one of the two maps.", "kind": "class", "line": 182, "name": "MapDelta", "signature": "class MapDelta"}, {"doc": "Deterministic validator for system map intermediate representations.", "kind": "class", "line": 202, "name": "SystemMapValidator", "signature": "class SystemMapValidator"}, {"doc": "Builds deterministic system maps from the scanned knowledge graph.", "kind": "class", "line": 426, "name": "SystemMapBuilder", "signature": "class SystemMapBuilder"}, {"doc": "Renders a system map as one self-contained interactive HTML document.", "kind": "class", "line": 1471, "name": "InteractiveMapRenderer", "signature": "class InteractiveMapRenderer"}, {"doc": "Renders a system map as a physics-driven vis.js network document.\n\nFetches the configured vis-network bundle from a CDN at view time,\nso pages need network access. Nodes stay draggable with live\nphysics; use the inline renderer when fully offline output matters.", "kind": "class", "line": 2186, "name": "VisNetworkRenderer", "signature": "class VisNetworkRenderer"}, {"doc": "Publishes validated system maps as a static documentation site.\n\nWrites one standalone map document per diagram kind plus a gallery\nindex page, ready to serve as project documentation or a static\nhosting root. All output is self-contained with zero external\nrequests and relative links only.", "kind": "class", "line": 2707, "name": "DocsSitePublisher", "signature": "class DocsSitePublisher"}, {"doc": "Initialise the validator with application configuration.\n\nArgs:\n    config: Central settings for map size limits.", "kind": "method", "line": 205, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Return the canvas bounds applying per-map full-mode growth.\n\nArgs:\n    system_map: Map carrying optional canvas_width/canvas_height metadata.\n\nReturns:\n    Effective canvas width and height pair.", "kind": "method", "line": 213, "name": "_effective_canvas", "signature": "def _effective_canvas(self, system_map)"}, {"doc": "Validate a system map and return a deterministic receipt.\n\nArgs:\n    system_map: Map intermediate representation to validate.\n\nReturns:\n    Validation receipt with executed checks and diagnostics.", "kind": "method", "line": 234, "name": "validate", "signature": "def validate(self, system_map)"}, {"doc": "Initialise the builder with application configuration.\n\nArgs:\n    config: Central settings for layout geometry and limits.", "kind": "method", "line": 455, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Return the supported diagram kind identifiers.\n\nReturns:\n    Ordered list of the configured diagram kinds.", "kind": "method", "line": 464, "name": "supported_kinds", "signature": "def supported_kinds(self)"}, {"doc": "Return whether full-map scope applies for this build.\n\nArgs:\n    full: Explicit caller override, None honors configuration.\n\nReturns:\n    True when every scanned file must be included without truncation.", "kind": "method", "line": 472, "name": "_is_full", "signature": "def _is_full(self, full)"}, {"doc": "Build one deterministic system map of the requested kind.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Raw import edges.\n    resolved_edges: Project-internal resolved import edges.\n    layers: Mapping of file identifier to architectural layer.\n    findings: Security findings used for sensitivity marking.\n    analysis: Graph analysis used for centrality ranking.\n    kind: Diagram kind identifier.\n    full: True includes every file with a grown canvas, None honors config.\n\nReturns:\n    Validated system map intermediate representation.", "kind": "method", "line": 485, "name": "build", "signature": "def build(self, nodes, edges, resolved_edges, layers, findings, analysis, kind, full)"}, {"doc": "Build all five diagram kinds deterministically.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Raw import edges.\n    resolved_edges: Project-internal resolved import edges.\n    layers: Mapping of file identifier to architectural layer.\n    findings: Security findings used for sensitivity marking.\n    analysis: Graph analysis used for centrality ranking.\n    full: True includes every file with a grown canvas, None honors config.\n\nReturns:\n    Mapping of diagram kind to system map.", "kind": "method", "line": 523, "name": "build_all", "signature": "def build_all(self, nodes, edges, resolved_edges, layers, findings, analysis, full)"}, {"doc": "Compare two maps of the same kind as before, delta, and after.\n\nArgs:\n    base: Baseline system map.\n    head: Revised system map.\n\nReturns:\n    Deterministic delta with added, removed, changed, moved, rerouted facts.", "kind": "method", "line": 554, "name": "compare", "signature": "def compare(self, base, head)"}, {"doc": "Return the display title for a diagram kind.\n\nArgs:\n    kind: Diagram kind identifier.\n\nReturns:\n    Human-readable diagram title.", "kind": "method", "line": 593, "name": "_title_for", "signature": "def _title_for(self, kind)"}, {"doc": "Return the semantic role for a group with sensitivity override.\n\nArgs:\n    group: Architectural layer group name.\n    sensitive: True when the file carries elevated findings.\n\nReturns:\n    Semantic role identifier.", "kind": "method", "line": 607, "name": "_role_for", "signature": "def _role_for(self, group, sensitive)"}, {"doc": "Return files carrying elevated severity findings.\n\nArgs:\n    findings: Security findings to inspect.\n\nReturns:\n    Set of file paths with critical or high severity.", "kind": "method", "line": 624, "name": "_sensitive_files", "signature": "def _sensitive_files(self, findings)"}, {"doc": "Rank file identifiers by centrality then symbol count.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges used for degree scoring.\n    analysis: Optional analysis with god node scores.\n\nReturns:\n    File identifiers ordered by importance.", "kind": "method", "line": 641, "name": "_ranked_file_ids", "signature": "def _ranked_file_ids(self, nodes, links, analysis)"}, {"doc": "Select the primary node scope honoring the configured limit.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges used for ranking.\n    analysis: Optional analysis with centrality scores.\n    full: True returns every ranked node without truncation.\n\nReturns:\n    Primary nodes in deterministic ranked order.", "kind": "method", "line": 676, "name": "_select_primary", "signature": "def _select_primary(self, nodes, links, analysis, full)"}, {"doc": "Filter edges to project-internal links between selected files.\n\nArgs:\n    edges: Candidate edges.\n    selected: Selected file identifiers.\n    full: True keeps every internal edge without truncation.\n\nReturns:\n    Deterministically ordered internal edges.", "kind": "method", "line": 702, "name": "_internal_links", "signature": "def _internal_links(self, edges, selected, full)"}, {"doc": "Build truncated symbol records for map documentation payloads.\n\nArgs:\n    node: Scanned file node with extracted symbols.\n\nReturns:\n    Symbol records ordered by line, capped by configuration.", "kind": "method", "line": 725, "name": "_symbol_records", "signature": "def _symbol_records(self, node)"}, {"doc": "Shorten a label to the configured readable length.\n\nArgs:\n    value: Raw label text.\n\nReturns:\n    Truncated label with length guard applied.", "kind": "method", "line": 747, "name": "_short_label", "signature": "def _short_label(self, value)"}, {"doc": "Compute deterministic column lane coordinates for grouped items.\n\nArgs:\n    items: Pairs of identifier and group name.\n    kind: Diagram kind used only for metadata completeness.\n    full: True keeps every lane and grows the canvas instead of dropping.\n\nReturns:\n    Mapping of identifier to canvas coordinates.", "kind": "method", "line": 762, "name": "_layout_columns", "signature": "def _layout_columns(self, items, kind, full)"}, {"doc": "Drop lowest-priority lanes until columns fit the canvas width.\n\nArgs:\n    lanes: Lane names in priority order.\n\nReturns:\n    Leading lanes whose node boxes fit the canvas width.", "kind": "method", "line": 810, "name": "_lanes_that_fit", "signature": "def _lanes_that_fit(self, lanes)"}, {"doc": "Compress spacing deterministically so items fit the canvas.\n\nArgs:\n    count: Number of items placed along the axis.\n    item: Fixed item extent along the axis.\n    gap: Preferred spacing between items.\n    total: Total canvas extent along the axis.\n    margin: Margin reserved on each side.\n\nReturns:\n    Spacing that keeps every item inside the canvas.", "kind": "method", "line": 827, "name": "_fitted_gap", "signature": "def _fitted_gap(self, count, item, gap, total, margin)"}, {"doc": "Return the maximum members per lane fitting the canvas height.\n\nReturns:\n    Number of node rows fitting between lane top and margin.", "kind": "method", "line": 851, "name": "_lane_capacity", "signature": "def _lane_capacity(self)"}, {"doc": "Cap ranked nodes per lane so every lane fits the canvas height.\n\nArgs:\n    ranked: Nodes in global rank order.\n    layer_of: Mapping of file identifier to lane name.\n\nReturns:\n    Scoped nodes preserving rank order within each lane.", "kind": "method", "line": 865, "name": "_cap_lane_scope", "signature": "def _cap_lane_scope(self, ranked, layer_of)"}, {"doc": "Compute deterministic lifeline row coordinates for sequences.\n\nArgs:\n    ordered: Participant identifiers in display order.\n    full: True wraps participants across rows instead of truncating width.\n\nReturns:\n    Mapping of identifier to canvas coordinates.", "kind": "method", "line": 889, "name": "_layout_sequence", "signature": "def _layout_sequence(self, ordered, full)"}, {"doc": "Return the maximum participants fitting the canvas width.\n\nReturns:\n    Number of lifelines fitting with minimum spacing applied.", "kind": "method", "line": 926, "name": "_sequence_capacity", "signature": "def _sequence_capacity(self)"}, {"doc": "Cap lane scope and compute coordinates for placed nodes only.\n\nArgs:\n    ranked: Nodes in global rank order.\n    layer_of: Mapping of file identifier to lane name.\n    kind: Diagram kind used only for metadata completeness.\n    full: True keeps every node without lane caps or drops.\n\nReturns:\n    Canvas positions and the placed node subset.", "kind": "method", "line": 940, "name": "_place", "signature": "def _place(self, ranked, layer_of, kind, full)"}, {"doc": "Grow the canvas to enclose every placed node in full mode.\n\nArgs:\n    positions: Placed node coordinates.\n    full: True grows beyond configured bounds, False returns configured size.\n\nReturns:\n    Effective canvas width and height pair.", "kind": "method", "line": 960, "name": "_canvas_for", "signature": "def _canvas_for(self, positions, full)"}, {"doc": "Build generation metadata with honest scope and canvas size.\n\nArgs:\n    kind: Diagram kind identifier, unused beyond completeness.\n    placed: Authored map nodes.\n    links: Authored edge count.\n    total: Total scanned file count.\n    positions: Placed coordinates used for canvas growth.\n    full: True tags the map as untruncated with a grown canvas.\n\nReturns:\n    Metadata mapping for receipts and exports.", "kind": "method", "line": 978, "name": "_meta_for", "signature": "def _meta_for(self, kind, placed, links, total, positions, full)"}, {"doc": "Create guided chapters from authored topology.\n\nArgs:\n    kind: Diagram kind identifier.\n    primary: Ordered primary path node identifiers.\n    links: Authored internal relationships.\n\nReturns:\n    Guided chapters limited to the configured maximum.", "kind": "method", "line": 1001, "name": "_make_views", "signature": "def _make_views(self, kind, primary, links)"}, {"doc": "Build the runtime architecture map from file topology.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges.\n    layers: Layer mapping.\n    findings: Security findings.\n    analysis: Graph analysis.\n    full: True keeps every file without truncation.\n\nReturns:\n    Architecture system map.", "kind": "method", "line": 1073, "name": "_build_architecture", "signature": "def _build_architecture(self, nodes, links, layers, findings, analysis, full)"}, {"doc": "Build the delivery workflow map across architectural lanes.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges.\n    layers: Layer mapping.\n    findings: Security findings.\n    full: True keeps every file without lane sampling.\n\nReturns:\n    Workflow system map.", "kind": "method", "line": 1133, "name": "_build_workflow", "signature": "def _build_workflow(self, nodes, links, layers, findings, full)"}, {"doc": "Build the request sequence map over top participants.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges.\n    layers: Layer mapping.\n    analysis: Graph analysis.\n    full: True keeps every participant with wrapped rows.\n\nReturns:\n    Sequence system map.", "kind": "method", "line": 1213, "name": "_build_sequence", "signature": "def _build_sequence(self, nodes, links, layers, analysis, full)"}, {"doc": "Build the data flow map from sources through stores.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges.\n    layers: Layer mapping.\n    findings: Security findings for sensitivity.\n    full: True keeps every file without truncation.\n\nReturns:\n    Dataflow system map.", "kind": "method", "line": 1295, "name": "_build_dataflow", "signature": "def _build_dataflow(self, nodes, links, layers, findings, full)"}, {"doc": "Build the change lifecycle map with waits, retries, and terminals.\n\nArgs:\n    nodes: Scanned file nodes.\n    links: Internal edges.\n    layers: Layer mapping.\n    findings: Security findings.\n    full: True keeps every file without truncation.\n\nReturns:\n    Lifecycle system map.", "kind": "method", "line": 1378, "name": "_build_lifecycle", "signature": "def _build_lifecycle(self, nodes, links, layers, findings, full)"}, {"doc": "Initialise the renderer with application configuration.\n\nArgs:\n    config: Central settings for preset, theme, and share size.", "kind": "method", "line": 1474, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Return the effective canvas size for rendering a map.\n\nArgs:\n    system_map: Map carrying optional grown canvas metadata.\n\nReturns:\n    Effective canvas width and height pair.", "kind": "method", "line": 1482, "name": "_canvas_size", "signature": "def _canvas_size(self, system_map)"}, {"doc": "Render a system map as a self-contained HTML document.\n\nArgs:\n    system_map: Validated system map intermediate representation.\n\nReturns:\n    Complete standalone HTML document with inline SVG and scripting.", "kind": "method", "line": 1503, "name": "render", "signature": "def render(self, system_map)"}, {"doc": "Render a system map and write it to a relative output path.\n\nArgs:\n    system_map: System map intermediate representation.\n    output_path: Destination file path.\n\nReturns:\n    Rendered HTML document that was written.", "kind": "method", "line": 1605, "name": "write", "signature": "def write(self, system_map, output_path)"}, {"doc": "Serialize a payload for safe inline script embedding.\n\nArgs:\n    payload: JSON-serializable payload.\n\nReturns:\n    JSON text with angle brackets unicode-escaped.", "kind": "method", "line": 1624, "name": "_safe_json", "signature": "def _safe_json(self, payload)"}, {"doc": "Escape text for SVG and HTML embedding.\n\nArgs:\n    value: Raw text.\n\nReturns:\n    Escaped text safe for markup contexts.", "kind": "method", "line": 1635, "name": "_escape", "signature": "def _escape(self, value)"}, {"doc": "Return the stroke color for a semantic role.\n\nArgs:\n    role: Semantic role identifier.\n\nReturns:\n    Hex color string for the role.", "kind": "method", "line": 1646, "name": "_role_color", "signature": "def _role_color(self, role)"}, {"doc": "Compute a deterministic curved route between two nodes.\n\nArgs:\n    x1: Source horizontal center.\n    y1: Source vertical center.\n    x2: Target horizontal center.\n    y2: Target vertical center.\n\nReturns:\n    SVG path data string.", "kind": "method", "line": 1657, "name": "_edge_path", "signature": "def _edge_path(self, x1, y1, x2, y2)"}, {"doc": "Render authored nodes as inline SVG groups.\n\nArgs:\n    system_map: System map intermediate representation.\n\nReturns:\n    SVG fragment with one group per node.", "kind": "method", "line": 1693, "name": "_nodes_svg", "signature": "def _nodes_svg(self, system_map)"}, {"doc": "Render authored relationships as inline SVG paths.\n\nArgs:\n    system_map: System map intermediate representation.\n\nReturns:\n    SVG fragment with one path per relationship.", "kind": "method", "line": 1741, "name": "_edges_svg", "signature": "def _edges_svg(self, system_map)"}, {"doc": "Return the self-contained viewer document template.\n\nReturns:\n    HTML template with replacement tokens for map content.", "kind": "method", "line": 1788, "name": "_template", "signature": "def _template(self)"}, {"doc": "Initialise the renderer with application configuration.\n\nArgs:\n    config: Central settings for CDN bundle and physics.", "kind": "method", "line": 2194, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Render a system map as a vis.js network HTML document.\n\nArgs:\n    system_map: Validated system map intermediate representation.\n\nReturns:\n    HTML document driving a draggable physics network.", "kind": "method", "line": 2202, "name": "render", "signature": "def render(self, system_map)"}, {"doc": "Render a vis.js map and write it to a relative output path.\n\nArgs:\n    system_map: System map intermediate representation.\n    output_path: Destination file path.\n\nReturns:\n    Rendered HTML document that was written.", "kind": "method", "line": 2303, "name": "write", "signature": "def write(self, system_map, output_path)"}, {"doc": "Build a documentation tooltip for a network node.\n\nArgs:\n    node: Authored map node.\n\nReturns:\n    Escaped tooltip markup with docs and top symbols.", "kind": "method", "line": 2320, "name": "_tooltip", "signature": "def _tooltip(self, node)"}, {"doc": "Return the vis.js viewer document template.\n\nReturns:\n    HTML template with replacement tokens for map content.", "kind": "method", "line": 2351, "name": "_template", "signature": "def _template(self)"}, {"doc": "Initialise the publisher with application configuration.\n\nArgs:\n    config: Central settings for pages layout and map limits.", "kind": "method", "line": 2724, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Return the gallery description for a diagram kind.\n\nArgs:\n    kind: Diagram kind identifier.\n\nReturns:\n    Human-readable gallery description.", "kind": "method", "line": 2734, "name": "description_for", "signature": "def description_for(self, kind)"}, {"doc": "Publish maps and a gallery index into a documentation directory.\n\nArgs:\n    maps: Mapping of diagram kind to system map.\n    project_name: Display name used for index titles.\n    output_dir: Destination directory for the static site.\n    stats: Optional project counters shown in the gallery header.\n    renderer: Map renderer with a write method, defaults to offline.\n    project_root: Optional project root used to collect video and docs.\n    video_rel: Optional precomputed video href relative to the index.\n    doc_entries: Optional precomputed doc entries with name and href.\n\nReturns:\n    Mapping of published page identifier to written file path.", "kind": "method", "line": 2748, "name": "publish", "signature": "def publish(self, maps, project_name, output_dir, stats, renderer, project_root, video_rel, doc_entries)"}, {"doc": "Collect generated markdown sources for the static site.\n\nArgs:\n    project_root: Project root directory to scan for docs.\n\nReturns:\n    Sorted list of markdown file paths capped by configuration.", "kind": "method", "line": 2836, "name": "collect_doc_sources", "signature": "def collect_doc_sources(self, project_root)"}, {"doc": "Copy overview video and markdown docs into the static site.\n\nArgs:\n    project_root: Project root holding generated artifacts.\n    output_dir: Static site root receiving copied assets.\n\nReturns:\n    Mapping with video_rel, doc_entries, and written paths.", "kind": "method", "line": 2862, "name": "publish_assets", "signature": "def publish_assets(self, project_root, output_dir)"}, {"doc": "Delete copied markdown docs that no longer exist in the project.\n\nThe docs subdirectory is owned by the publisher; without pruning,\nrenamed wiki or paged agent files would linger in the site forever.\n\nArgs:\n    docs_root: Site directory holding copied markdown.\n    keep: Relative paths published in this run.", "kind": "method", "line": 2918, "name": "_prune_stale_docs", "signature": "def _prune_stale_docs(docs_root, keep)"}, {"doc": "Render an llms.txt entry point so agents can navigate the site as text.\n\nFollows the llms.txt convention: an H1 title, a blockquote summary,\nthen H2 sections of markdown links. Agent-oriented markdown comes\nfirst because it is cheaper to read than the HTML maps.\n\nArgs:\n    project_name: Display name used for the title.\n    maps: Mapping of published diagram kind to system map.\n    stats: Project counters summarized in the blockquote.\n    href_prefix: Relative prefix pointing at the map directory.\n    doc_entries: Published markdown docs with name and href.\n\nReturns:\n    Plain markdown text for llms.txt.", "kind": "method", "line": 2935, "name": "render_llms_txt", "signature": "def render_llms_txt(self, project_name, maps, stats, href_prefix, doc_entries)"}, {"doc": "Render the gallery index page for published maps.\n\nArgs:\n    project_name: Display name used for index titles.\n    maps: Mapping of published diagram kind to system map.\n    stats: Project counters shown in the gallery header.\n    href_prefix: Relative prefix pointing at the map directory.\n    video_rel: Optional video href relative to the index.\n    doc_entries: Optional doc entries with name, href, preview.\n\nReturns:\n    Complete standalone HTML gallery document.", "kind": "method", "line": 3011, "name": "render_index", "signature": "def render_index(self, project_name, maps, stats, href_prefix, video_rel, doc_entries)"}, {"doc": "Render the overview video section with an HTML5 video tag.\n\nArgs:\n    video_rel: Video href relative to the index, None hides the section.\n\nReturns:\n    HTML section fragment, empty string when no video is available.", "kind": "method", "line": 3170, "name": "_video_section", "signature": "def _video_section(self, video_rel)"}, {"doc": "Render the documentation grid with an offline markdown viewer.\n\nArgs:\n    doc_entries: Doc entries with name, href, and preview keys.\n\nReturns:\n    HTML section fragment, empty string when no docs are available.", "kind": "method", "line": 3194, "name": "_docs_section", "signature": "def _docs_section(self, doc_entries)"}, {"doc": "Return the relative href prefix for map links.\n\nReturns:\n    Map subdirectory with trailing slash, or empty string.", "kind": "method", "line": 3239, "name": "_href_prefix", "signature": "def _href_prefix(self)"}, {"doc": "Render one gallery card linking to a published map.\n\nArgs:\n    kind: Diagram kind identifier.\n    system_map: Published system map.\n    href_prefix: Relative prefix pointing at the map directory.\n\nReturns:\n    HTML card fragment with a relative map link.", "kind": "method", "line": 3250, "name": "_card", "signature": "def _card(self, kind, system_map, href_prefix)"}, {"doc": "Render the gallery header statistics line.\n\nArgs:\n    stats: Project counters.\n\nReturns:\n    Escaped statistics summary string.", "kind": "method", "line": 3289, "name": "_stats_line", "signature": "def _stats_line(self, stats)"}, {"doc": "Escape text for HTML embedding.\n\nArgs:\n    value: Raw text.\n\nReturns:\n    Escaped text safe for markup contexts.", "kind": "method", "line": 3303, "name": "_escape", "signature": "def _escape(self, value)"}, {"doc": "Sort entry points first, then alphabetically.", "kind": "method", "line": 2983, "name": "order", "signature": "def order(entry)"}]}, {"doc": "KNOWLEDGE_BASE.md generator: the human-facing architecture reference.  Renders the dashboard, layers, communities, CPG, taint, hotspots, cycles, security audit, Mermaid graph, and per-file reference sections.", "id": "readmenator/_documentation.py", "kind": "module", "label": "_documentation.py", "language": "py", "sha256": "53f41fd1e065ee70", "symbol_count": 28, "symbols": [{"doc": "Builds the KNOWLEDGE_BASE.md document from scanned nodes and edges.\n\nDelegates graph rendering to MermaidRenderer and handles the\nMarkdown layout: header metadata, Mermaid block, statistics dashboard,\ngod nodes, community analysis, surprising connections, architecture\nlayers, security audit, taint analysis, hotspots, dependency cycles,\nchange impact, architecture violations, suggested rules, CPG block,\nranking metadata, orphans, query recipes, and per-language architecture\nsections with pluralised symbol kind headings.", "kind": "class", "line": 33, "name": "DocumentationGenerator", "signature": "class DocumentationGenerator"}, {"kind": "method", "line": 45, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 63, "name": "_ranking_version", "signature": "def _ranking_version(self)"}, {"kind": "method", "line": 81, "name": "_get_git_commit", "signature": "def _get_git_commit()"}, {"kind": "method", "line": 91, "name": "generate", "signature": "def generate(self, nodes, edges, resolved_edges, analysis, layers, findings, analysis_v2, ranked)"}, {"kind": "method", "line": 178, "name": "_apply_context_budget", "signature": "def _apply_context_budget(self, content, nodes, edges, resolved_edges, analysis, analysis_v2, findings)"}, {"kind": "method", "line": 316, "name": "_build_toc", "signature": "def _build_toc(self, nodes, analysis, layers, findings, analysis_v2, is_truncated, ranked)"}, {"kind": "method", "line": 404, "name": "_build_layers", "signature": "def _build_layers(self, layers, nodes)"}, {"kind": "method", "line": 438, "name": "_build_dashboard", "signature": "def _build_dashboard(self, nodes, edges, resolved_edges)"}, {"kind": "method", "line": 518, "name": "_build_god_nodes", "signature": "def _build_god_nodes(self, analysis, ranked)"}, {"kind": "method", "line": 546, "name": "_build_community_analysis", "signature": "def _build_community_analysis(self, analysis, nodes)"}, {"kind": "method", "line": 579, "name": "_build_surprising_connections", "signature": "def _build_surprising_connections(self, analysis, nodes)"}, {"kind": "method", "line": 604, "name": "_build_suggested_questions", "signature": "def _build_suggested_questions(self, analysis)"}, {"kind": "method", "line": 620, "name": "_build_ranked_context", "signature": "def _build_ranked_context(self, ranked)"}, {"doc": "Build a section listing nodes with low coverage signals.", "kind": "method", "line": 666, "name": "_build_orphans", "signature": "def _build_orphans(self, nodes, analysis_v2, ranked)"}, {"kind": "method", "line": 716, "name": "_build_query_recipes", "signature": "def _build_query_recipes(self)"}, {"kind": "method", "line": 758, "name": "_build_taint_analysis", "signature": "def _build_taint_analysis(self, analysis_v2)"}, {"kind": "method", "line": 793, "name": "_build_hotspots", "signature": "def _build_hotspots(self, analysis_v2, ranked)"}, {"doc": "Build the procedural dataflow findings section.", "kind": "method", "line": 831, "name": "_build_dataflow_analysis", "signature": "def _build_dataflow_analysis(self, analysis_v2)"}, {"kind": "method", "line": 862, "name": "_build_dependency_cycles", "signature": "def _build_dependency_cycles(self, analysis_v2)"}, {"kind": "method", "line": 883, "name": "_build_change_impact", "signature": "def _build_change_impact(self, analysis_v2)"}, {"kind": "method", "line": 908, "name": "_build_layer_violations", "signature": "def _build_layer_violations(self, analysis_v2)"}, {"kind": "method", "line": 936, "name": "_build_suggested_rules", "signature": "def _build_suggested_rules(self, analysis_v2)"}, {"kind": "method", "line": 961, "name": "_build_security_findings", "signature": "def _build_security_findings(self, findings)"}, {"kind": "method", "line": 1008, "name": "_build_mermaid_section", "signature": "def _build_mermaid_section(self, graph_output, is_truncated)"}, {"kind": "method", "line": 1031, "name": "_build_uml_diagram", "signature": "def _build_uml_diagram(self, nodes, edges)"}, {"kind": "method", "line": 1057, "name": "_build_cpg_block", "signature": "def _build_cpg_block(self, nodes, edges, resolved_edges, analysis)"}, {"kind": "method", "line": 1083, "name": "_build_architecture_reference", "signature": "def _build_architecture_reference(self, nodes, edges)"}]}, {"doc": "Score explanation and path decomposition for the ranking system.  Provides human-readable explanations of why a particular node ranks where it does, including score breakdown, strongest paths from seeds, and quality signal summary.", "id": "readmenator/_explain.py", "kind": "module", "label": "_explain.py", "language": "py", "sha256": "1c5e324fb42169ed", "symbol_count": 3, "symbols": [{"doc": "Return a detailed breakdown of why *node_id* has its rank.\n\nIncludes score decomposition, seed paths, and quality signals.\n\nArgs:\n    node_id: The node to explain.\n    ranked: The RankedResult containing scores.\n    category: Optional Category for enriched path details.\n\nReturns:\n    Formatted explanation string, or None if node_id not found.", "kind": "function", "line": 16, "name": "explain_rank", "signature": "def explain_rank(node_id, ranked, category)"}, {"doc": "Return a short summary of the top-N ranked results.", "kind": "function", "line": 140, "name": "rank_summary", "signature": "def rank_summary(ranked, top_n)"}, {"kind": "function", "line": 163, "name": "_find_item", "signature": "def _find_item(node_id, items)"}]}, {"doc": "Multi-format exporter for the readmenator knowledge graph.  Produces JSON (GraphRAG-ready node-link format), interactive HTML (vis.js standalone), and static SVG (matplotlib-based) outputs from the scanned nodes, edges, and optional analysis results.", "id": "readmenator/_exporter.py", "kind": "module", "label": "_exporter.py", "language": "py", "sha256": "e8305a07a66f0e36", "symbol_count": 15, "symbols": [{"doc": "Exports the knowledge graph to JSON, HTML, and SVG formats.\n\nEach method is self-contained and produces a single file. No\nexternal network calls are made; the HTML file embeds vis.js\nfrom a CDN reference for offline-compatible rendering.", "kind": "class", "line": 21, "name": "GraphExporter", "signature": "class GraphExporter"}, {"doc": "Initialise with application configuration.\n\nArgs:\n    config: Settings for export styling and limits.", "kind": "method", "line": 29, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Export the graph as a node-link JSON string.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for metadata.\n    findings: Optional security audit findings.\n\nReturns:\n    JSON string with nodes, edges, and optional analysis/findings metadata.", "kind": "method", "line": 37, "name": "to_json", "signature": "def to_json(self, nodes, edges, resolved_edges, analysis, findings)"}, {"doc": "Generate a standalone interactive HTML graph page.\n\nUses vis.js loaded from CDN. Supports click-to-inspect nodes,\nsearch filtering, and community-based coloring.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for community coloring.\n\nReturns:\n    Complete HTML document as a string.", "kind": "method", "line": 150, "name": "to_html", "signature": "def to_html(self, nodes, edges, resolved_edges, analysis, findings)"}, {"doc": "Build a node-to-color map based on community membership.", "kind": "method", "line": 239, "name": "_community_color_map", "signature": "def _community_color_map(self, analysis)"}, {"doc": "Lighten a hex color by 30% for border use.", "kind": "method", "line": 257, "name": "_lighten", "signature": "def _lighten(hex_color)"}, {"doc": "Render the full HTML document with vis.js.", "kind": "method", "line": 265, "name": "_render_html", "signature": "def _render_html(self, vis_nodes, vis_edges, analysis, findings)"}, {"doc": "Generate a static SVG representation of the graph.\n\nUses a simple force-directed layout without external dependencies.\nFor graphs with more than SVG_MAX_NODES, returns a plain SVG\nwith a truncation message.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for community coloring.\n\nReturns:\n    SVG document as a string.", "kind": "method", "line": 436, "name": "to_svg", "signature": "def to_svg(self, nodes, edges, resolved_edges, analysis)"}, {"doc": "Render a minimal SVG with a truncation notice.", "kind": "method", "line": 554, "name": "_render_truncated_svg", "signature": "def _render_truncated_svg(self, total_nodes)"}, {"doc": "Compute a simple spring-layout for node positioning.\n\nImplements a basic force-directed layout with repulsion\nbetween all nodes and attraction along edges. Runs a fixed\nnumber of iterations for determinism.", "kind": "method", "line": 569, "name": "_layout_spring", "signature": "def _layout_spring(self, nodes, edges, node_map)"}, {"doc": "Export the graph as GraphML (Gephi/yEd compatible).\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for community data.\n\nReturns:\n    GraphML XML string.", "kind": "method", "line": 650, "name": "to_graphml", "signature": "def to_graphml(self, nodes, edges, resolved_edges, analysis)"}, {"doc": "Export the graph as native Cypher CREATE statements.\n\nGenerates Neo4j/Memgraph-compatible Cypher for direct graph\ndatabase ingestion. Each file node becomes a ``(:File)`` node,\nimport dependencies become ``(:File)-[:IMPORTS]->(:File)``\nrelationships. Optional security findings are attached as node\nproperties and standalone ``(:SecurityFinding)`` nodes.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    analysis: Optional analysis results for community metadata.\n    findings: Optional security finding nodes.\n\nReturns:\n    String of Cypher CREATE statements.", "kind": "method", "line": 727, "name": "to_cypher", "signature": "def to_cypher(self, nodes, edges, resolved_edges, analysis, findings)"}, {"doc": "Export the graph as an Obsidian vault with wikilinks.\n\nEach file node becomes a markdown note. Community hub notes\naggregate related files. All notes use [[wikilinks]] for\nObsidian graph navigation.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    output_dir: Directory to write the Obsidian notes.\n    analysis: Optional analysis results for community hubs.\n\nReturns:\n    Number of notes written.", "kind": "method", "line": 832, "name": "to_obsidian", "signature": "def to_obsidian(self, nodes, edges, output_dir, analysis)"}, {"kind": "method", "line": 498, "name": "_project", "signature": "def _project(pos)"}, {"kind": "method", "line": 337, "name": "_sev_span", "signature": "def _sev_span(sev, count)"}]}, {"doc": "GitHub wiki publisher: mirrors generated knowledge into the repository wiki.  Turns the readmenator wiki, agent docs, recipes, and KNOWLEDGE_BASE.md into flat GitHub wiki pages (Home, _Sidebar, _Footer), rewrites relative markdown links to wiki page names, and turns backticked project paths into commit-pinned source permalinks. Publishing clones ``<repo>.wiki.git``, replaces only pages it generated before (tracked in a state file), commits, and pushes. It is opt-in, never runs during analysis, and shells out with argument lists only (no shell).", "id": "readmenator/_gh_wiki.py", "kind": "module", "label": "_gh_wiki.py", "language": "py", "sha256": "48ab96c3ef223668", "symbol_count": 18, "symbols": [{"doc": "Outcome of a GitHub wiki publish.\n\nAttributes:\n    pages: Wiki page file names written.\n    removed: Previously generated page files deleted as stale.\n    pushed: Whether a commit was pushed to the wiki remote.\n    remote: Wiki remote URL used, empty in dry runs without a remote.\n    output_dir: Directory holding the rendered pages.\n    message: Human-readable status line.", "kind": "class", "line": 39, "name": "WikiPublishResult", "signature": "class WikiPublishResult"}, {"doc": "Renders and publishes generated documentation to a GitHub wiki.", "kind": "class", "line": 59, "name": "GitHubWikiPublisher", "signature": "class GitHubWikiPublisher"}, {"doc": "Store configuration and the subprocess runner (injectable for tests).\n\nArgs:\n    config: Central settings for paths, page names, and git options.\n    runner: Callable compatible with ``subprocess.run``.", "kind": "method", "line": 62, "name": "__init__", "signature": "def __init__(self, config, runner)"}, {"doc": "Map a generated markdown path to its flat GitHub wiki page name.\n\nArgs:\n    rel_path: Project-relative markdown path.\n\nReturns:\n    Wiki page name without extension.", "kind": "method", "line": 72, "name": "page_name", "signature": "def page_name(self, rel_path)"}, {"doc": "List project-relative markdown sources to publish, sorted.\n\nArgs:\n    project_root: Project root holding generated outputs.\n\nReturns:\n    Relative POSIX paths of regular, non-symlink markdown files.", "kind": "method", "line": 96, "name": "collect_sources", "signature": "def collect_sources(self, project_root)"}, {"doc": "Return the web URL prefix for commit-pinned source links, or empty.", "kind": "method", "line": 121, "name": "_blob_base", "signature": "def _blob_base(self, remote, commit)"}, {"doc": "Rewrite relative doc links to wiki pages and paths to source permalinks.\n\nArgs:\n    text: Markdown content of one source document.\n    rel_path: Project-relative path of that document.\n    names: Mapping of published relative paths to page names.\n    project_root: Project root used to check that paths exist.\n    blob_base: Commit-pinned blob URL prefix, empty to skip.\n\nReturns:\n    Markdown ready for the GitHub wiki.", "kind": "method", "line": 129, "name": "rewrite", "signature": "def rewrite(self, text, rel_path, names, project_root, blob_base)"}, {"doc": "Render every wiki page, including sidebar and footer.\n\nArgs:\n    project_root: Project root holding generated outputs.\n    remote: Main repository remote used for source permalinks.\n\nReturns:\n    Mapping of wiki file name to markdown content.", "kind": "method", "line": 179, "name": "render", "signature": "def render(self, project_root, remote)"}, {"doc": "Return a Home page used when the readmenator wiki was not generated.", "kind": "method", "line": 205, "name": "_fallback_home", "signature": "def _fallback_home(self, project_name)"}, {"doc": "Return the navigation sidebar grouping pages by origin.", "kind": "method", "line": 213, "name": "_sidebar", "signature": "def _sidebar(self, names)"}, {"doc": "Return the footer stamping the source commit and regeneration command.", "kind": "method", "line": 241, "name": "_footer", "signature": "def _footer(git)"}, {"doc": "Resolve the wiki remote from config, ``gh``, or the git origin.\n\nArgs:\n    project_root: Project root of the main repository.\n\nReturns:\n    The ``.wiki.git`` remote URL, or empty string when unknown.", "kind": "method", "line": 249, "name": "wiki_remote", "signature": "def wiki_remote(self, project_root)"}, {"doc": "Return the main repository URL via ``gh`` or ``git remote``.", "kind": "method", "line": 267, "name": "_origin", "signature": "def _origin(self, project_root)"}, {"doc": "Run a command without a shell and return stdout, or None on failure.", "kind": "method", "line": 279, "name": "_call", "signature": "def _call(self, command, cwd)"}, {"doc": "Write pages, delete stale previously generated ones, and record state.", "kind": "method", "line": 293, "name": "_write_pages", "signature": "def _write_pages(self, target, pages)"}, {"doc": "Render pages and push them to the GitHub wiki (or a local folder).\n\nArgs:\n    project_root: Project root holding generated outputs.\n    dry_run: Render into GH_WIKI_DRY_RUN_DIR without any git calls.\n\nReturns:\n    WikiPublishResult describing what was written and pushed.", "kind": "method", "line": 313, "name": "publish", "signature": "def publish(self, project_root, dry_run)"}, {"doc": "Replace one relative markdown link when its target is published.", "kind": "method", "line": 151, "name": "link", "signature": "def link(match)"}, {"doc": "Link a backticked project file (optionally with a line) to source.", "kind": "method", "line": 164, "name": "permalink", "signature": "def permalink(match)"}]}, {"doc": "Read-only git metadata for freshness stamps on generated documents.  Reads ``.git`` plumbing files directly (no subprocess, no network) so agents can compare a generated MANIFEST against ``git rev-parse HEAD`` and know whether the knowledge base is stale before trusting it.", "id": "readmenator/_gitmeta.py", "kind": "module", "label": "_gitmeta.py", "language": "py", "sha256": "f2d97022c2d6682a", "symbol_count": 4, "symbols": [{"doc": "Return the stripped text of a small regular file, or empty string.\n\nArgs:\n    path: File to read.\n\nReturns:\n    File contents, or empty string when missing, a symlink, or oversized.", "kind": "function", "line": 19, "name": "_read_small", "signature": "def _read_small(path)"}, {"doc": "Locate the git directory for a work tree, following gitdir files.\n\nArgs:\n    root: Work tree root.\n\nReturns:\n    The git directory path, or None when the root is not a repository.", "kind": "function", "line": 38, "name": "_git_dir", "signature": "def _git_dir(root)"}, {"doc": "Look up a ref in packed-refs, honoring worktree commondir.\n\nArgs:\n    git_dir: Git directory of the work tree.\n    ref: Fully qualified ref name.\n\nReturns:\n    The commit hash, or empty string.", "kind": "function", "line": 59, "name": "_packed_ref", "signature": "def _packed_ref(git_dir, ref)"}, {"doc": "Return the current commit and branch of a project, when available.\n\nArgs:\n    project_root: Work tree root directory.\n\nReturns:\n    Mapping with ``commit`` and ``branch`` keys (empty strings when\n    unknown or not a git repository).", "kind": "function", "line": 84, "name": "read_git_head", "signature": "def read_git_head(project_root)"}]}, {"doc": "Hotspot, dependency cycle, and change impact analysis.  Scores files by complexity plus centrality, finds import cycles with DFS, and measures transitive dependents with bounded BFS.", "id": "readmenator/_hotspots.py", "kind": "module", "label": "_hotspots.py", "language": "py", "sha256": "89a15a177df1f60a", "symbol_count": 7, "symbols": [{"doc": "Hotspot detection, cycle analysis, and change impact analysis.\n\nHotspots are files with high complexity (many symbols) and high\ncentrality (many connections). Cycle detection finds circular\ndependencies in the resolved import graph. Change impact analysis\ncomputes transitive-dependent lists for every file.", "kind": "class", "line": 22, "name": "HotspotAnalyzer", "signature": "class HotspotAnalyzer"}, {"kind": "method", "line": 31, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Rank files by combined complexity and centrality scores.\n\nComplexity is normalised symbol count. Centrality is normalised\nconnection count (in-degree + out-degree). The combined score\nuses configured weights.", "kind": "method", "line": 34, "name": "analyze_hotspots", "signature": "def analyze_hotspots(self, nodes, edges, resolved_edges)"}, {"doc": "Detect cycles in the resolved import graph using DFS.\n\nUses Tarjan's algorithm variant with three-colour DFS to find\nall elementary cycles. Returns each cycle as a DependencyCycle.", "kind": "method", "line": 90, "name": "detect_cycles", "signature": "def detect_cycles(self, nodes, resolved_edges)"}, {"doc": "Compute change impact for every file in the project.\n\nFor each file, finds all files that would be affected if it\nchanged (direct and transitive dependents via reverse import\ngraph traversal).", "kind": "method", "line": 155, "name": "analyze_change_impact", "signature": "def analyze_change_impact(self, nodes, resolved_edges)"}, {"kind": "method", "line": 114, "name": "_dfs_visit", "signature": "def _dfs_visit(current)"}, {"kind": "method", "line": 125, "name": "_record_cycle", "signature": "def _record_cycle(start, end)"}]}, {"doc": "Architecture layer rule engine: forbidden and warning edges between layers.", "id": "readmenator/_layer_rules.py", "kind": "module", "label": "_layer_rules.py", "language": "py", "sha256": "d210f851b1778697", "symbol_count": 4, "symbols": [{"doc": "Architectural layer violation detection engine.\n\nDefines a set of permitted and forbidden layer-to-layer import\nrules. Scans all resolved import edges and flags violations\nwhere one layer imports from another in a way that violates\nthe architecture.", "kind": "class", "line": 11, "name": "LayerRuleEngine", "signature": "class LayerRuleEngine"}, {"kind": "method", "line": 36, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Detect architectural layer violations.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved import edges.\n    layers: Dict mapping node_id to layer name. If None, imports\n        _layers.LayerDetector for automatic detection.\n\nReturns:\n    List of LayerViolation instances.", "kind": "method", "line": 39, "name": "detect_violations", "signature": "def detect_violations(self, nodes, edges, resolved_edges, layers)"}, {"doc": "Summarise violations by severity.", "kind": "method", "line": 111, "name": "violation_summary", "signature": "def violation_summary(violations)"}]}, {"doc": "Architectural layer detection for the readmenator knowledge graph.  Infers architectural layers (presentation, business logic, data access, infrastructure, testing, configuration) from file paths, naming conventions, and import patterns. No external API calls.", "id": "readmenator/_layers.py", "kind": "module", "label": "_layers.py", "language": "py", "sha256": "74e808d11118e2e5", "symbol_count": 7, "symbols": [{"doc": "Detects architectural layers in a codebase.\n\nAssigns each file to a layer based on path patterns, naming\nconventions, and imported frameworks. Returns a mapping that\ncan enrich documentation and analysis. No config dependency.", "kind": "class", "line": 17, "name": "LayerDetector", "signature": "class LayerDetector"}, {"doc": "Assign each file node to an architectural layer.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n\nReturns:\n    Dict mapping node_id to layer name.", "kind": "method", "line": 83, "name": "detect", "signature": "def detect(self, nodes, edges)"}, {"doc": "Split a path into lowercase word tokens, honoring camelCase.", "kind": "method", "line": 108, "name": "_path_tokens", "signature": "def _path_tokens(cls, node_id)"}, {"doc": "Return whether a layer pattern matches path tokens as a whole word.\n\nShort patterns (``ui``, ``di``, ``api``) must equal a token;\nlonger ones also match token prefixes (``tests``, ``views``).\nMulti-word patterns match underscore-joined token runs.", "kind": "method", "line": 114, "name": "_pattern_hits", "signature": "def _pattern_hits(cls, pattern, tokens, joined)"}, {"doc": "Return the top-level module names of raw import strings.", "kind": "method", "line": 128, "name": "_import_roots", "signature": "def _import_roots(cls, imports)"}, {"doc": "Classify a single file into an architectural layer.\n\nPath words score one point each, framework imports three, and\ntest-file naming five. Layers in _EVIDENCE_REQUIRED_LAYERS only\naccept framework points when the path already points there, so a\nCLI that imports ``unittest`` to run the suite stays production code.", "kind": "method", "line": 138, "name": "_classify_file", "signature": "def _classify_file(self, node, edges, imports)"}, {"doc": "Count files per layer.\n\nArgs:\n    layers: Mapping from detect().\n\nReturns:\n    Dict of layer_name -> file_count.", "kind": "method", "line": 189, "name": "layer_summary", "signature": "def layer_summary(layers)"}]}, {"doc": "Architecture linter for the readmenator knowledge graph.  Evaluates files against predefined architectural rules: file length limits, cross-layer import violations, and circular dependency detection. All rules are deterministic and token-free.", "id": "readmenator/_linter.py", "kind": "module", "label": "_linter.py", "language": "py", "sha256": "f3c1132fa2972d19", "symbol_count": 7, "symbols": [{"doc": "Enforces architectural rules over scanned nodes and edges.\n\nChecks file length, cross-layer import violations, and circular\ndependencies. Returns structured LinterViolation instances for\neach detected issue.", "kind": "class", "line": 18, "name": "ArchitectureLinter", "signature": "class ArchitectureLinter"}, {"kind": "method", "line": 31, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Run all linter rules and return violations.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    layers: Optional mapping from node_id to layer name.\n    content_map: Optional mapping from node_id to file content.\n\nReturns:\n    List of LinterViolation instances sorted by severity.", "kind": "method", "line": 34, "name": "lint", "signature": "def lint(self, nodes, edges, resolved_edges, layers, content_map)"}, {"doc": "Check files against maximum line count threshold.", "kind": "method", "line": 65, "name": "_check_file_length", "signature": "def _check_file_length(self, nodes, content_map)"}, {"doc": "Check for forbidden cross-layer imports.", "kind": "method", "line": 96, "name": "_check_cross_layer_violations", "signature": "def _check_cross_layer_violations(self, nodes, edges, resolved_edges, layers)"}, {"doc": "Check for circular dependencies in the resolved import graph.", "kind": "method", "line": 127, "name": "_check_circular_dependencies", "signature": "def _check_circular_dependencies(self, nodes, resolved_edges)"}, {"kind": "method", "line": 146, "name": "_dfs", "signature": "def _dfs(current)"}]}, {"doc": "MCP (Model Context Protocol) stdio server for ReadMenator.  Exposes the full codebase knowledge graph as MCP tools and resources, allowing AI agents to query structural information without parsing KNOWLEDGE_BASE.md as text. Each query costs ~50-200 tokens vs 2000-8000+ tokens of reading the full KB file.  Tools: readmenator.summary       — codebase overview (files, symbols, langs) readmenator.query         — free-text symbol/file search readmenator.explain       — detailed symbol explanation readmenator.path          — dependency chain between two symbols readmenator.findings      — security findings readmenator.taint         — taint propagation analysis readmenator.hotspots      — hotspot analysis readmenator.cycles        — dependency cycles readmenator.communities   — community detection readmenator.layers        — architectural layers readmenator.layer_violations — layer rule violations readmenator.rebuild       — regenerate KNOWLEDGE_BASE.md readmenator.update        — incremental update (SHA256 cache) readmenator.export_json   — export graph.json readmenator.security_summary — security audit summary  Resources: readmenator://summary     — structured JSON summary readmenator://graph       — graph data (nodes + edges) readmenator://file/{path} — file details readmenator://symbol/{name} — symbol details readmenator://findings    — security findings", "id": "readmenator/_mcp_server.py", "kind": "module", "label": "_mcp_server.py", "language": "py", "sha256": "96151f2ad60cfb2d", "symbol_count": 52, "symbols": [{"kind": "class", "line": 58, "name": "MCPError", "signature": "class MCPError(Exception)"}, {"kind": "class", "line": 71, "name": "MCPRequest", "signature": "class MCPRequest"}, {"kind": "class", "line": 92, "name": "MCPTool", "signature": "class MCPTool"}, {"kind": "class", "line": 119, "name": "MCPResource", "signature": "class MCPResource"}, {"kind": "class", "line": 146, "name": "MCPServer", "signature": "class MCPServer"}, {"doc": "CLI entry point for `readmenator serve <path>`.", "kind": "method", "line": 796, "name": "main", "signature": "def main()"}, {"kind": "method", "line": 59, "name": "__init__", "signature": "def __init__(self, code, message, data)"}, {"kind": "method", "line": 72, "name": "__init__", "signature": "def __init__(self, msg)"}, {"kind": "method", "line": 79, "name": "is_notification", "signature": "def is_notification(self)"}, {"kind": "method", "line": 82, "name": "response", "signature": "def response(self, result)"}, {"kind": "method", "line": 85, "name": "error", "signature": "def error(self, code, message, data)"}, {"kind": "method", "line": 93, "name": "__init__", "signature": "def __init__(self, name, description, handler, input_schema)"}, {"kind": "method", "line": 108, "name": "definition", "signature": "def definition(self)"}, {"kind": "method", "line": 115, "name": "call", "signature": "def call(self, arguments)"}, {"kind": "method", "line": 120, "name": "__init__", "signature": "def __init__(self, uri, name, description, mime_type, handler)"}, {"kind": "method", "line": 134, "name": "definition", "signature": "def definition(self)"}, {"kind": "method", "line": 142, "name": "read", "signature": "def read(self)"}, {"kind": "method", "line": 147, "name": "__init__", "signature": "def __init__(self, app, target_dir)"}, {"kind": "method", "line": 155, "name": "register_tool", "signature": "def register_tool(self, tool)"}, {"kind": "method", "line": 158, "name": "register_resource", "signature": "def register_resource(self, resource)"}, {"kind": "method", "line": 161, "name": "_ensure_kb", "signature": "def _ensure_kb(self)"}, {"kind": "method", "line": 173, "name": "_handle_initialize", "signature": "def _handle_initialize(self, req)"}, {"kind": "method", "line": 187, "name": "_handle_list_tools", "signature": "def _handle_list_tools(self, req)"}, {"kind": "method", "line": 192, "name": "_handle_call_tool", "signature": "def _handle_call_tool(self, req)"}, {"kind": "method", "line": 214, "name": "_handle_list_resources", "signature": "def _handle_list_resources(self, req)"}, {"kind": "method", "line": 219, "name": "_handle_read_resource", "signature": "def _handle_read_resource(self, req)"}, {"kind": "method", "line": 241, "name": "dispatch", "signature": "def dispatch(self, req)"}, {"kind": "method", "line": 261, "name": "run", "signature": "def run(self)"}, {"kind": "method", "line": 285, "name": "_register_all", "signature": "def _register_all(self)"}, {"kind": "method", "line": 467, "name": "_scan", "signature": "def _scan(self)"}, {"kind": "method", "line": 473, "name": "_scan_deep", "signature": "def _scan_deep(self)"}, {"kind": "method", "line": 481, "name": "_tool_summary", "signature": "def _tool_summary(self)"}, {"kind": "method", "line": 519, "name": "_tool_query", "signature": "def _tool_query(self, text)"}, {"kind": "method", "line": 524, "name": "_tool_explain", "signature": "def _tool_explain(self, name)"}, {"kind": "method", "line": 536, "name": "_tool_path", "signature": "def _tool_path(self, symbol_a, symbol_b)"}, {"kind": "method", "line": 547, "name": "_tool_findings", "signature": "def _tool_findings(self, min_severity)"}, {"kind": "method", "line": 577, "name": "_tool_security_summary", "signature": "def _tool_security_summary(self)"}, {"kind": "method", "line": 582, "name": "_tool_taint", "signature": "def _tool_taint(self)"}, {"kind": "method", "line": 603, "name": "_tool_hotspots", "signature": "def _tool_hotspots(self, top_n)"}, {"kind": "method", "line": 619, "name": "_tool_cycles", "signature": "def _tool_cycles(self)"}, {"kind": "method", "line": 630, "name": "_tool_communities", "signature": "def _tool_communities(self)"}, {"kind": "method", "line": 645, "name": "_tool_layers", "signature": "def _tool_layers(self)"}, {"kind": "method", "line": 663, "name": "_tool_layer_violations", "signature": "def _tool_layer_violations(self)"}, {"kind": "method", "line": 679, "name": "_tool_rebuild", "signature": "def _tool_rebuild(self)"}, {"kind": "method", "line": 689, "name": "_tool_update", "signature": "def _tool_update(self)"}, {"kind": "method", "line": 697, "name": "_tool_export_json", "signature": "def _tool_export_json(self)"}, {"kind": "method", "line": 705, "name": "_resource_summary", "signature": "def _resource_summary(self)"}, {"kind": "method", "line": 722, "name": "_resource_graph", "signature": "def _resource_graph(self)"}, {"kind": "method", "line": 741, "name": "_resource_findings", "signature": "def _resource_findings(self)"}, {"kind": "method", "line": 757, "name": "_resource_analysis", "signature": "def _resource_analysis(self)"}, {"kind": "method", "line": 787, "name": "_resource_kb", "signature": "def _resource_kb(self)"}, {"kind": "method", "line": 791, "name": "_get_query_engine", "signature": "def _get_query_engine(self, nodes, edges, resolved)"}]}, {"doc": "Mermaid graph renderer with intelligent pruning.  Converts the internal Node/Edge graph into a Mermaid flowchart (string) suitable for embedding in Markdown. Handles node limits, deduplication, CSS-like class styling, internal import edges, and community subgraphs.", "id": "readmenator/_mermaid.py", "kind": "module", "label": "_mermaid.py", "language": "py", "sha256": "5832baaa4731cd40", "symbol_count": 4, "symbols": [{"doc": "Renders a knowledge graph to Mermaid JS flowchart syntax.\n\nNodes are ordered by import count and symbol richness; the top\n``max_nodes`` entries are included. External dependencies appear\nas dashed boxes. Internal import edges are solid arrows.\nCommunity subgraphs group related files when analysis is available.", "kind": "class", "line": 17, "name": "MermaidRenderer", "signature": "class MermaidRenderer"}, {"kind": "method", "line": 26, "name": "__init__", "signature": "def __init__(self, max_nodes, max_symbols_per_file, module_style, class_style, function_style, external_style, internal_edge_style)"}, {"doc": "Convert *node_id* to a Mermaid-safe identifier.\n\nReplaces non-alphanumeric characters with underscores and\nprepends ``n_`` if the result starts with a digit.", "kind": "method", "line": 45, "name": "_sanitize_id", "signature": "def _sanitize_id(node_id)"}, {"doc": "Produce a Mermaid flowchart string and a truncation flag.\n\nNodes are sorted by import popularity, then by symbol count.\nInternal import edges (between project files) are rendered as\nsolid arrows when *resolved_edges* is provided. Community\nsubgraphs wrap related files when *analysis* is given.\n\nReturns:\n    Tuple of (Mermaid source string, is_truncated bool).", "kind": "method", "line": 56, "name": "render", "signature": "def render(self, nodes, edges, resolved_edges, analysis)"}]}, {"doc": "Data model types for the readmenator knowledge graph.  Defines the core entity types -- Symbol, Node, Edge -- plus a utility function for pluralising symbol kind labels and a helper for constructing community analysis results. Every parser, scanner, renderer, and query engine depends on these definitions.", "id": "readmenator/_models.py", "kind": "module", "label": "_models.py", "language": "py", "sha256": "758ca743fd06046b", "symbol_count": 20, "symbols": [{"doc": "A single code symbol extracted from a source file.\n\nAttributes:\n    name: Identifier of the symbol (class name, function name, etc.).\n    kind: Semantic type (class, function, struct, enum, ...).\n    line: One-based line number where the symbol is defined.\n    doc: Optional docstring or comment extracted from the source.\n    signature: Optional method or function signature snippet.", "kind": "class", "line": 18, "name": "Symbol", "signature": "class Symbol"}, {"doc": "A file node in the knowledge graph, containing its symbols.\n\nAttributes:\n    node_id: Relative path of the file used as a unique identifier.\n    label: Base file name for display purposes.\n    kind: Type of node (typically \"module\").\n    language: Programming language derived from the file extension.\n    doc: Optional file-level documentation string.\n    symbols: List of Symbol instances defined in this file.", "kind": "class", "line": 37, "name": "Node", "signature": "class Node"}, {"doc": "A directed relationship between two nodes in the knowledge graph.\n\nAttributes:\n    source: Node ID of the source (dependent) file.\n    target: Node ID of the target (dependency) file or module.\n    relation: Semantic relation label (e.g. \"imports\", \"resolved_imports\").\n    confidence: Confidence tier (\"EXTRACTED\" for structural, \"INFERRED\" for heuristic).\n    kind: Optional typed edge kind for ranking-aware computations.", "kind": "class", "line": 58, "name": "Edge", "signature": "class Edge"}, {"doc": "A security-relevant pattern detected in a source file.\n\nAttributes:\n    file_path: Relative path of the file containing the finding.\n    line: One-based line number where the pattern was found.\n    severity: Severity level (critical, high, medium, low, info).\n    rule_id: Unique identifier for the detection rule (e.g. \"PY001\").\n    description: Human-readable explanation of the issue.\n    snippet: The offending source code line.\n    cwe: CWE identifier string (e.g. \"CWE-78\").\n    mitre_attack: MITRE ATT&CK technique ID (e.g. \"T1059.001\").", "kind": "class", "line": 77, "name": "SecurityFinding", "signature": "class SecurityFinding"}, {"doc": "Return the plural form of *kind* according to *plural_map*.\n\nFalls back to appending ``\"s\"`` when the kind is not found.\nThis prevents obvious misspellings like ``\"Classs\"``.", "kind": "method", "line": 101, "name": "pluralize_symbol_kind", "signature": "def pluralize_symbol_kind(kind, plural_map)"}, {"doc": "Result of community detection on the import graph.\n\nAttributes:\n    community_id: Integer identifier of the community.\n    label: Human-readable name for the community.\n    file_ids: Set of node IDs belonging to this community.\n    cohesion: Cohesion score (internal edges / total edges involving community).\n    size: Number of files in the community.", "kind": "class", "line": 111, "name": "CommunityResult", "signature": "class CommunityResult"}, {"doc": "Complete graph analysis output.\n\nAttributes:\n    god_nodes: List of (node_id, score) for most central nodes.\n    communities: List of CommunityResult instances.\n    surprising_connections: List of (source_node, target_node, hops, bridging_communities).\n    suggested_questions: List of plain-language exploration questions.\n    node_count: Total nodes in the graph.\n    edge_count: Total edges in the graph.", "kind": "class", "line": 130, "name": "AnalysisResult", "signature": "class AnalysisResult"}, {"doc": "A taint propagation path from source to sink through the import graph.\n\nAttributes:\n    source_file: The file that introduces the dangerous import.\n    sink_file: The file that transitively receives the taint.\n    path: List of file node IDs forming the propagation chain.\n    hops: Number of hops in the propagation path.\n    dangerous_import: The specific dangerous module or function imported.\n    severity: Inferred severity of the taint path.", "kind": "class", "line": 151, "name": "TaintPath", "signature": "class TaintPath"}, {"doc": "Complete taint propagation analysis output.\n\nAttributes:\n    paths: List of TaintPath instances discovered.\n    source_count: Number of unique taint source files.\n    sink_count: Number of unique taint sink files.", "kind": "class", "line": 172, "name": "TaintAnalysisResult", "signature": "class TaintAnalysisResult"}, {"doc": "A cycle detected in the resolved import graph.\n\nAttributes:\n    cycle: List of file node IDs forming the cycle.\n    length: Number of files in the cycle.", "kind": "class", "line": 187, "name": "DependencyCycle", "signature": "class DependencyCycle"}, {"doc": "Change impact analysis for a single file.\n\nAttributes:\n    file_id: The file that would be changed.\n    direct_dependents: Files that directly import this file.\n    transitive_dependents: Files that transitively depend on this file.\n    total_impact: Total number of affected files (direct + transitive).", "kind": "class", "line": 200, "name": "ChangeImpact", "signature": "class ChangeImpact"}, {"doc": "A hotspot file combining complexity and centrality metrics.\n\nAttributes:\n    file_id: The file node ID.\n    complexity_score: Normalised symbol count score (0-1).\n    centrality_score: Normalised god node score (0-1).\n    combined_score: Weighted combination of complexity and centrality.\n    symbol_count: Raw symbol count.\n    connection_count: Raw connection count.", "kind": "class", "line": 217, "name": "HotspotResult", "signature": "class HotspotResult"}, {"doc": "A suggested linting/security rule derived from code patterns.\n\nAttributes:\n    rule_id: Suggested rule identifier (e.g. \"RM001\").\n    severity: Suggested severity (info, warning, error).\n    description: Human-readable description of the pattern.\n    pattern: The detected pattern or code snippet.\n    file_examples: Example file paths where the pattern was found.\n    match_count: Number of times the pattern was matched.\n    language: Target language for the rule.\n    semgrep_yaml: Optional Semgrep rule YAML string.", "kind": "class", "line": 238, "name": "SuggestedRule", "signature": "class SuggestedRule"}, {"doc": "A detected architectural layer violation.\n\nAttributes:\n    source_file: The file causing the violation.\n    source_layer: The layer of the source file.\n    target_file: The file being imported.\n    target_layer: The layer of the target file.\n    description: Description of the violation.\n    severity: Severity (strict, warn, info).", "kind": "class", "line": 263, "name": "LayerViolation", "signature": "class LayerViolation"}, {"doc": "Extended analysis result combining all new analysis modules.\n\nAttributes:\n    taint: Optional taint analysis result.\n    cycles: List of dependency cycles.\n    change_impacts: List of change impact results for key files.\n    hotspots: List of hotspot results.\n    suggested_rules: List of suggested linting rules.\n    layer_violations: List of layer violations.\n    dataflow_issues: List of procedural dataflow findings.", "kind": "class", "line": 284, "name": "AnalysisResultV2", "signature": "class AnalysisResultV2"}, {"doc": "A procedural intra-function dataflow finding.\n\nAttributes:\n    file_path: Relative path of the file containing the issue.\n    function: Name of the enclosing function.\n    line: One-based line number of the suspicious operation.\n    kind: Issue kind (UNINIT_USE, DEAD_STORE, UNCHECKED_ALLOC).\n    variable: Name of the involved local variable.\n    description: Human-readable explanation of the suspicion.\n    confidence: Confidence tier (always INFERRED for heuristics).", "kind": "class", "line": 307, "name": "DataflowIssue", "signature": "class DataflowIssue"}, {"doc": "A violation detected by the architecture linter.\n\nAttributes:\n    file_path: Relative path of the file containing the violation.\n    rule_id: Unique identifier for the linter rule (e.g. \"ARC001\").\n    severity: Severity level (error, warning, info).\n    message: Human-readable description of the violation.", "kind": "class", "line": 330, "name": "LinterViolation", "signature": "class LinterViolation"}, {"doc": "A dead code symbol identified by the stripper.\n\nAttributes:\n    file_path: Relative path of the file containing the symbol.\n    symbol_name: Name of the dead symbol.\n    symbol_type: Type of symbol (function, class, method, etc.).\n    recommendation: Recommended action (MOVE_TO_TRASH, REVIEW, KEEP).", "kind": "class", "line": 347, "name": "DeadCodeReport", "signature": "class DeadCodeReport"}, {"doc": "A single refactoring action within a plan.\n\nAttributes:\n    action_type: Type of action (EXTRACT_CLASS, EXTRACT_FUNCTION, MOVE_SYMBOL).\n    source_file: The file to refactor.\n    start_line: Start line of the code range to extract.\n    end_line: End line of the code range to extract.\n    target_file: The new file to create (for EXTRACT actions).\n    description: Human-readable description of the action.", "kind": "class", "line": 364, "name": "RefactoringAction", "signature": "class RefactoringAction"}, {"doc": "A complete refactoring plan for a monolithic file.\n\nAttributes:\n    file_path: The file to refactor.\n    actions: List of refactoring actions to perform.\n    estimated_impact: Number of files affected by the refactoring.\n    current_lines: Current line count of the file.", "kind": "class", "line": 385, "name": "RefactoringPlan", "signature": "class RefactoringPlan"}]}, {"doc": "AnalyzerFactory (lazy component construction) and DeepAnalysisRunner.  Decouples the application orchestrator from concrete analyzers and runs the v2 analyses (taint, cycles, impact, hotspots, rules, layers, dataflow).", "id": "readmenator/_pipeline.py", "kind": "module", "label": "_pipeline.py", "language": "py", "sha256": "3430264b4fff1645", "symbol_count": 34, "symbols": [{"doc": "Lazy factory for all readmenator analyzer and generator instances.\n\nDecouples the application orchestrator from the concrete\ninstantiation of analysis modules. Each component is created\non first access and cached for the lifetime of the factory.", "kind": "class", "line": 49, "name": "AnalyzerFactory", "signature": "class AnalyzerFactory"}, {"doc": "Orchestrates the extended V2 analysis pipeline.\n\nRuns taint propagation, hotspot detection, cycle detection,\nchange impact, layer violations, and rule generation as a\ncoordinated batch. Isolated from the main app to reduce\ncoupling in the primary orchestration layer.", "kind": "class", "line": 292, "name": "DeepAnalysisRunner", "signature": "class DeepAnalysisRunner"}, {"kind": "method", "line": 57, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 88, "name": "scanner", "signature": "def scanner(self)"}, {"kind": "method", "line": 94, "name": "generator", "signature": "def generator(self)"}, {"kind": "method", "line": 100, "name": "analyzer", "signature": "def analyzer(self)"}, {"kind": "method", "line": 106, "name": "security", "signature": "def security(self)"}, {"kind": "method", "line": 112, "name": "exporter", "signature": "def exporter(self)"}, {"kind": "method", "line": 118, "name": "taint", "signature": "def taint(self)"}, {"doc": "Return the lazily initialised dataflow analyzer.", "kind": "method", "line": 124, "name": "dataflow", "signature": "def dataflow(self)"}, {"kind": "method", "line": 131, "name": "hotspots", "signature": "def hotspots(self)"}, {"kind": "method", "line": 137, "name": "layer_rules", "signature": "def layer_rules(self)"}, {"kind": "method", "line": 143, "name": "rule_gen", "signature": "def rule_gen(self)"}, {"kind": "method", "line": 149, "name": "sarif", "signature": "def sarif(self)"}, {"kind": "method", "line": 155, "name": "cpg", "signature": "def cpg(self)"}, {"kind": "method", "line": 164, "name": "layer_detector", "signature": "def layer_detector(self)"}, {"kind": "method", "line": 170, "name": "uml", "signature": "def uml(self)"}, {"doc": "Return the lazily initialised agent wiki generator.", "kind": "method", "line": 176, "name": "wiki", "signature": "def wiki(self)"}, {"kind": "method", "line": 183, "name": "readme_injector", "signature": "def readme_injector(self)"}, {"kind": "method", "line": 193, "name": "agent_injector", "signature": "def agent_injector(self)"}, {"doc": "Return the lazily initialised GitHub wiki publisher.", "kind": "method", "line": 203, "name": "gh_wiki", "signature": "def gh_wiki(self)"}, {"kind": "method", "line": 210, "name": "agent_output", "signature": "def agent_output(self)"}, {"doc": "Return the lazily initialised system map builder.", "kind": "method", "line": 216, "name": "diagram_builder", "signature": "def diagram_builder(self)"}, {"doc": "Return the lazily initialised interactive map renderer.", "kind": "method", "line": 223, "name": "diagram_renderer", "signature": "def diagram_renderer(self)"}, {"doc": "Return the lazily initialised system map validator.", "kind": "method", "line": 230, "name": "diagram_validator", "signature": "def diagram_validator(self)"}, {"doc": "Return the lazily initialised documentation site publisher.", "kind": "method", "line": 237, "name": "diagram_publisher", "signature": "def diagram_publisher(self)"}, {"doc": "Return the lazily initialised vis.js network renderer.", "kind": "method", "line": 244, "name": "vis_renderer", "signature": "def vis_renderer(self)"}, {"doc": "Return the lazily initialised cinematic video renderer.", "kind": "method", "line": 251, "name": "video", "signature": "def video(self)"}, {"kind": "method", "line": 257, "name": "build_typed_graph", "signature": "def build_typed_graph(self, nodes, edges, resolved_edges)"}, {"doc": "Create a CompositeRanker for the given typed graph.", "kind": "method", "line": 267, "name": "make_ranker", "signature": "def make_ranker(self, typed_graph)"}, {"kind": "method", "line": 284, "name": "last_category", "signature": "def last_category(self)"}, {"kind": "method", "line": 288, "name": "last_typed_graph", "signature": "def last_typed_graph(self)"}, {"kind": "method", "line": 301, "name": "__init__", "signature": "def __init__(self, factory)"}, {"kind": "method", "line": 304, "name": "run", "signature": "def run(self, nodes, edges, resolved_edges, layers, content_map)"}]}, {"doc": "Functors and projections for the readmenator code category.  Defines projection functors that preserve structure but change the point of view: F_docs (code -> documentation), F_risk (code -> risk), and view-based projections for architecture, execution, quality, and change impact analysis.", "id": "readmenator/_projections.py", "kind": "module", "label": "_projections.py", "language": "py", "sha256": "1bf2c182b76b0945", "symbol_count": 15, "symbols": [{"doc": "A functor from C_code to another category.\n\nMaps nodes and morphisms while preserving composition structure.", "kind": "class", "line": 17, "name": "Projection", "signature": "class Projection(Protocol)"}, {"doc": "Identity functor: maps everything to itself.", "kind": "class", "line": 32, "name": "IdentityProjection", "signature": "class IdentityProjection"}, {"doc": "F_docs: project code to documentation.\n\nKeeps only nodes that have docstrings or are referenced in README.\nUseful for quantifying documentation gaps.", "kind": "class", "line": 42, "name": "DocProjection", "signature": "class DocProjection"}, {"doc": "F_risk: project code to risk/fragility nodes.\n\nNodes are transformed with risk attributes: fan-in, fan-out,\nsymbol count, test absence, and public API exposure.", "kind": "class", "line": 63, "name": "RiskProjection", "signature": "class RiskProjection"}, {"doc": "Apply a named view to produce a projected category.\n\nView config format::\n    {\n        \"edge_types\": [EdgeKind.IMPORTS, EdgeKind.DEFINES, ...],\n        \"direction\": \"forward\" | \"reverse\",  # default \"forward\"\n    }\n\nArgs:\n    category: Source category.\n    view_config: View definition dict.\n\nReturns:\n    A new Category with only matching morphisms.", "kind": "method", "line": 95, "name": "apply_view", "signature": "def apply_view(category, view_config)"}, {"doc": "Map a code node. Return None to exclude.", "kind": "method", "line": 23, "name": "map_node", "signature": "def map_node(self, node)"}, {"doc": "Map a morphism. Return None to exclude.", "kind": "method", "line": 27, "name": "map_morphism", "signature": "def map_morphism(self, m)"}, {"kind": "method", "line": 35, "name": "map_node", "signature": "def map_node(self, node)"}, {"kind": "method", "line": 38, "name": "map_morphism", "signature": "def map_morphism(self, m)"}, {"kind": "method", "line": 49, "name": "__init__", "signature": "def __init__(self, documented_ids)"}, {"kind": "method", "line": 52, "name": "map_node", "signature": "def map_node(self, node)"}, {"kind": "method", "line": 57, "name": "map_morphism", "signature": "def map_morphism(self, m)"}, {"kind": "method", "line": 70, "name": "__init__", "signature": "def __init__(self, fan_in, fan_out, test_files)"}, {"kind": "method", "line": 80, "name": "map_node", "signature": "def map_node(self, node)"}, {"kind": "method", "line": 91, "name": "map_morphism", "signature": "def map_morphism(self, m)"}]}, {"doc": "Purpose extraction shared by every agent-facing document generator.  Turns raw file and symbol docstrings into one clean, bounded sentence that tells a reader what a file is for. Banner rules, SPDX headers, encoding cookies, and bare file names are rejected; files without a module docstring fall back to the docstring of their primary symbol so agent indexes never show an empty purpose when the code explains itself.", "id": "readmenator/_purpose.py", "kind": "module", "label": "_purpose.py", "language": "py", "sha256": "539642983e59296b", "symbol_count": 7, "symbols": [{"doc": "Return True for doc lines that carry no purpose signal.\n\nArgs:\n    text: One doc line.\n\nReturns:\n    Whether the line is too short, an encoding cookie, or symbol noise.", "kind": "function", "line": 26, "name": "is_garbage_doc", "signature": "def is_garbage_doc(text)"}, {"doc": "Return the purpose signal of a doc first line, or an empty string.\n\nArgs:\n    text: First line of a file or symbol docstring.\n\nReturns:\n    The line without banners, SPDX tags, and leading file names.", "kind": "function", "line": 43, "name": "clean_purpose", "signature": "def clean_purpose(text)"}, {"doc": "Escape markdown table breaking characters in one line of text.\n\nArgs:\n    text: Arbitrary text destined for a table cell.\n\nReturns:\n    Single-line text with pipes escaped.", "kind": "function", "line": 66, "name": "escape_cell", "signature": "def escape_cell(text)"}, {"doc": "Truncate text at a word boundary and mark the cut with an ellipsis.\n\nArgs:\n    text: Text to shorten.\n    max_chars: Maximum length of the returned string.\n\nReturns:\n    The original text when short enough, otherwise a word-aligned prefix.", "kind": "function", "line": 78, "name": "truncate_words", "signature": "def truncate_words(text, max_chars)"}, {"doc": "Return the first clean sentence of the first meaningful paragraph.\n\nArgs:\n    doc: Full docstring text.\n\nReturns:\n    One sentence with whitespace collapsed, or an empty string.", "kind": "function", "line": 98, "name": "first_sentence", "signature": "def first_sentence(doc)"}, {"doc": "Pick the documented symbol that best represents a file.\n\nPublic symbols outrank private ones and type-like kinds outrank\nfunctions; ties fall back to source order.\n\nArgs:\n    symbols: Symbols extracted from one file.\n\nReturns:\n    The representative documented symbol, or None.", "kind": "function", "line": 116, "name": "_primary_symbol", "signature": "def _primary_symbol(symbols)"}, {"doc": "Return a bounded one-sentence purpose for a file node.\n\nArgs:\n    node: Scanned file node.\n    max_chars: Maximum characters of the returned purpose.\n\nReturns:\n    Module doc sentence, else ``Symbol: sentence`` from the primary\n    documented symbol, else an empty string.", "kind": "function", "line": 140, "name": "file_purpose", "signature": "def file_purpose(node, max_chars)"}]}, {"doc": "Query engine for the readmenator knowledge base.  Supports natural-language-like search (``query``), symbol explanation (``explain``), dependency-path tracing (``find_path``), ranked queries via PageRank/PPR integration (``ranked_query``), and a concise codebase overview (``summary``). All queries operate on an in-memory index built from the scanned Node/Edge list.", "id": "readmenator/_query.py", "kind": "module", "label": "_query.py", "language": "py", "sha256": "4677486e84eaae1c", "symbol_count": 17, "symbols": [{"doc": "In-memory query engine over the scanned knowledge graph.\n\nBuilds a symbol-name index and an import-adjacency graph on\nconstruction. Provides exact and fuzzy symbol lookup, detailed\nexplanation output, BFS shortest-path resolution, free-text\nsearch, and a summary report.", "kind": "class", "line": 25, "name": "QueryEngine", "signature": "class QueryEngine"}, {"doc": "Initialise internal indexes from scanned data.\n\nArgs:\n    nodes: List of scanned file nodes.\n    edges: List of import-relationship edges.\n    resolved_edges: Optional resolved-import edges (both\n        source and target are project file IDs).\n    ranker: Optional CompositeRanker for ranked queries.\n    config: Optional RankConfig if ranker is not provided.", "kind": "method", "line": 34, "name": "__init__", "signature": "def __init__(self, nodes, edges, resolved_edges, ranker, config)"}, {"doc": "Build a default CompositeRanker from the loaded data.", "kind": "method", "line": 64, "name": "_init_default_ranker", "signature": "def _init_default_ranker(self)"}, {"doc": "Answer *query* with a ranked list of relevant nodes.\n\nUses Personalized PageRank seeded from lexical matches\nagainst the query text, combined with authority, test\ncoverage, doc coverage, and freshness signals.\n\nArgs:\n    query: Free-text query string.\n    top_n: Number of results to return (default: RankConfig.top_n).\n\nReturns:\n    A RankedResult with scored items and explanations.", "kind": "method", "line": 73, "name": "ranked_query", "signature": "def ranked_query(self, query, top_n)"}, {"doc": "Estimate test coverage per file.\n\nA file is considered 'tested' if a test file imports it.\nReturns fraction of symbols referenced across test files.", "kind": "method", "line": 124, "name": "_estimate_test_coverage", "signature": "def _estimate_test_coverage(self)"}, {"doc": "Estimate documentation coverage per file.\n\nA file has doc coverage if it has a file-level docstring or\nany of its symbols have docstrings.", "kind": "method", "line": 150, "name": "_estimate_doc_coverage", "signature": "def _estimate_doc_coverage(self)"}, {"doc": "Build a name-to-list-of-(node, symbol) lookup.\n\nReturns:\n    Dict mapping symbol names to list of (Node, Symbol) tuples.", "kind": "method", "line": 170, "name": "_build_symbol_index", "signature": "def _build_symbol_index(self)"}, {"doc": "Build an adjacency map from import edges.\n\nReturns:\n    Dict mapping each file node_id to its set of import targets.", "kind": "method", "line": 184, "name": "_build_import_graph", "signature": "def _build_import_graph(self)"}, {"doc": "Build an adjacency map from resolved import edges.\n\nOnly contains edges where both source and target are\nproject files (not external modules).\n\nReturns:\n    Dict mapping each file node_id to files it imports within the project.", "kind": "method", "line": 200, "name": "_build_resolved_graph", "signature": "def _build_resolved_graph(self)"}, {"doc": "Look up *name* by exact match, then by substring fuzzy match.\n\nReturns:\n    A list of (Node, Symbol) tuples, or ``None`` if not found.", "kind": "method", "line": 220, "name": "find_symbol", "signature": "def find_symbol(self, name)"}, {"doc": "Return a detailed multi-line explanation of *name*.\n\nIncludes kind, file path, line number, docstring, signature,\nimports, reverse dependencies (\"imported by\"), and sibling\nsymbols in the same file.\n\nReturns:\n    Formatted string or ``None`` if the symbol is not found.", "kind": "method", "line": 238, "name": "explain", "signature": "def explain(self, name)"}, {"doc": "List all node IDs that import *target*.", "kind": "method", "line": 277, "name": "_find_incoming_imports", "signature": "def _find_incoming_imports(self, target)"}, {"doc": "Find the shortest import path from *symbol_a* to *symbol_b*.\n\nUses BFS on the resolved import graph (project-internal edges)\nfirst, traversing in both directions (forward = A imports B,\nreverse = B is imported by A). Falls back to the raw import\ngraph if no resolved path exists.\n\nReturns:\n    List of file node IDs forming the dependency chain, or ``None``.", "kind": "method", "line": 285, "name": "find_path", "signature": "def find_path(self, symbol_a, symbol_b)"}, {"doc": "Convert a directed graph to a bidirectional one.\n\nFor each edge A→B, adds both A→B and B→A edges.", "kind": "method", "line": 315, "name": "_make_bidirectional", "signature": "def _make_bidirectional(graph)"}, {"doc": "Run BFS to find the shortest path from *start* to *goal*.\n\nReturns:\n    List of node IDs or ``None`` if no path exists.", "kind": "method", "line": 331, "name": "_bfs_shortest_path", "signature": "def _bfs_shortest_path(self, graph, start, goal)"}, {"doc": "Free-text search over symbols and file paths.\n\nTokenises the input, matches against symbol names (substring)\nand then against file paths as a fallback. Returns a\nhuman-readable result string summarising matches or a\nno-results message with KB statistics.", "kind": "method", "line": 355, "name": "query", "signature": "def query(self, question)"}, {"doc": "Return a concise overview of the loaded knowledge base.\n\nReports file count, symbol count, import count, language\ndiversity, top-level modules (by import popularity), and\nlists of key class-like and function-like symbols.", "kind": "method", "line": 411, "name": "summary", "signature": "def summary(self)"}]}, {"doc": "PageRank, Personalized PageRank, HITS, and composite scoring.  Provides typed-graph-aware ranking for the readmenator knowledge graph. Global PageRank measures structural authority; Personalized PageRank measures query-specific relevance; HITS separates authorities from hubs; composite scoring combines multiple quality signals into a single explainable rank.", "id": "readmenator/_rank.py", "kind": "module", "label": "_rank.py", "language": "py", "sha256": "9cea35495030eb51", "symbol_count": 17, "symbols": [{"doc": "Tuneable parameters for the ranking system.\n\nAttributes:\n    alpha: Damping factor for PageRank (default 0.85).\n    max_iter: Maximum power-iteration steps.\n    tolerance: Convergence threshold (L1 norm).\n    top_n: Default number of ranked results to return.\n    noise_penalty: Multiplier applied to hub-penalty names\n        when they are not part of the query seeds.\n    composite_ppr_weight: Weight for PPR in composite score.\n    composite_authority_weight: Weight for global PageRank.\n    composite_test_weight: Weight for test coverage signal.\n    composite_doc_weight: Weight for documentation coverage.\n    composite_freshness_weight: Weight for code freshness.", "kind": "class", "line": 32, "name": "RankConfig", "signature": "class RankConfig"}, {"doc": "Compute global PageRank on the typed weighted graph.\n\nUses power iteration on the stochastic matrix derived from\nthe TypedGraph's edge weights. Dangling nodes (no outgoing\nedges) are handled by uniform random teleportation.\n\nArgs:\n    graph: A TypedGraph instance with weighted edges.\n    alpha: Damping factor (probability of following an edge).\n    max_iter: Maximum power-iteration steps.\n    tolerance: Convergence threshold (L1 norm).\n\nReturns:\n    Dict mapping node_id -> PageRank score. Scores sum to 1.0.", "kind": "method", "line": 61, "name": "global_pagerank", "signature": "def global_pagerank(graph, alpha, max_iter, tolerance)"}, {"doc": "Compute Personalized PageRank with a seed-node preference vector.\n\nInstead of uniform teleportation, probability mass is distributed\naccording to the seed vector. This makes the ranking sensitive to\na specific query or context.\n\nArgs:\n    graph: A TypedGraph instance.\n    seeds: Dict mapping seed node_id -> preference mass (sums to 1.0).\n    alpha: Damping factor.\n    max_iter: Maximum power-iteration steps.\n    tolerance: Convergence threshold (L1 norm).\n\nReturns:\n    Dict mapping node_id -> PPR score. Scores sum to 1.0.", "kind": "method", "line": 119, "name": "personalized_pagerank", "signature": "def personalized_pagerank(graph, seeds, alpha, max_iter, tolerance)"}, {"doc": "Compute HITS (Hyperlink-Induced Topic Search) authorities and hubs.\n\nAuthorities are nodes with many incoming edges from good hubs.\nHubs are nodes with many outgoing edges to good authorities.\n\nReturns:\n    Tuple of (authorities, hubs) as dicts mapping node_id -> score.\n    Scores are L2-normalised.", "kind": "method", "line": 189, "name": "hits", "signature": "def hits(graph, max_iter, tolerance)"}, {"doc": "Build a PPR seed vector from a natural-language query string.\n\nMatches query tokens against node IDs, labels, and symbol names.\nSeeds are assigned equal mass. If no match is found, returns\nempty dict (will use uniform teleportation).\n\nArgs:\n    query: Free-text query string.\n    node_ids: All valid node IDs.\n    node_labels: Mapping from node_id -> display label.\n    symbols: Mapping from node_id -> list of symbol names.\n\nReturns:\n    Dict of seed node_id -> equal mass fraction.", "kind": "method", "line": 240, "name": "build_seeds_from_query", "signature": "def build_seeds_from_query(query, node_ids, node_labels, symbols)"}, {"doc": "Build a PPR seed vector from anchor pattern strings.\n\nNodes whose ID or label contains any anchor pattern receive\nequal seed mass. Useful for section-level seeding.\n\nArgs:\n    node_ids: All valid node IDs.\n    anchor_patterns: List of substrings to match.\n\nReturns:\n    Dict of seed node_id -> equal mass fraction.", "kind": "method", "line": 286, "name": "build_seeds_for_context", "signature": "def build_seeds_for_context(node_ids, anchor_patterns)"}, {"doc": "A single ranked result with score decomposition.\n\nAttributes:\n    node_id: The ranked node ID.\n    composite_score: Final multi-signal score.\n    ppr_score: Personalized PageRank contribution.\n    authority_score: Global PageRank contribution.\n    test_coverage: Fraction of symbols referenced in test files.\n    doc_coverage: Fraction of symbols with documentation.\n    freshness: Decay-weighted recency signal.\n    justification_paths: Shortest paths from seed nodes to this node.", "kind": "class", "line": 320, "name": "RankedItem", "signature": "class RankedItem"}, {"doc": "Complete ranking result for a query or context.\n\nAttributes:\n    query: The query string or context label.\n    items: Ranked items in descending score order.\n    config: The RankConfig used.\n    seed_nodes: The seed node IDs used for PPR.\n    model_version: Version identifier for the ranking model.", "kind": "class", "line": 349, "name": "RankedResult", "signature": "class RankedResult"}, {"doc": "Combines PPR, authority, test/doc coverage, and freshness.\n\nProduces a single composite score per node:\nS_q(n) = w_ppr * PPR_q(n) + w_auth * Auth(n) + w_test * Test(n)\n       + w_doc * Doc(n) + w_fresh * Fresh(n)", "kind": "class", "line": 377, "name": "CompositeRanker", "signature": "class CompositeRanker"}, {"doc": "Format a human-readable explanation for a ranked item.", "kind": "method", "line": 512, "name": "_format_explanation", "signature": "def _format_explanation(item, result)"}, {"kind": "method", "line": 344, "name": "label", "signature": "def label(self)"}, {"kind": "method", "line": 366, "name": "top", "signature": "def top(self, n)"}, {"doc": "Return a human-readable explanation of why *node_id* ranks as it does.", "kind": "method", "line": 369, "name": "explain", "signature": "def explain(self, node_id)"}, {"kind": "method", "line": 385, "name": "__init__", "signature": "def __init__(self, graph, config)"}, {"kind": "method", "line": 394, "name": "_get_global_pr", "signature": "def _get_global_pr(self)"}, {"doc": "Compute composite ranking for a query.\n\nArgs:\n    query: Query string.\n    seeds: PPR seed vector.\n    category: Category with morphisms for path finding.\n    node_ids: All valid node IDs.\n    test_coverage: Optional dict of node_id -> test coverage (0-1).\n    doc_coverage: Optional dict of node_id -> doc coverage (0-1).\n    freshness: Optional dict of node_id -> freshness (0-1).\n\nReturns:\n    A RankedResult with scored and sorted items.", "kind": "method", "line": 404, "name": "rank", "signature": "def rank(self, query, seeds, category, node_ids, test_coverage, doc_coverage, freshness)"}, {"doc": "Find shortest paths from any seed to target.", "kind": "method", "line": 486, "name": "_find_justification_paths", "signature": "def _find_justification_paths(self, target, seed_ids, category, max_paths)"}]}, {"doc": "Injects a knowledge base section into the project README (Markdown or RST).", "id": "readmenator/_readme_injector.py", "kind": "module", "label": "_readme_injector.py", "language": "py", "sha256": "ef4591270405752e", "symbol_count": 8, "symbols": [{"doc": "Injects a link to KNOWLEDGE_BASE.md into the project README.\n\nDetects the project's README file, checks if injection is already\npresent, and appends a descriptive section about the knowledge base\nso that both human developers and AI agents know it exists.", "kind": "class", "line": 70, "name": "ReadmeInjector", "signature": "class ReadmeInjector"}, {"kind": "method", "line": 78, "name": "__init__", "signature": "def __init__(self, kb_filename, agent_output_dir, wiki_output_dir)"}, {"kind": "method", "line": 88, "name": "inject", "signature": "def inject(self, project_root)"}, {"kind": "method", "line": 117, "name": "_extract_current_injection", "signature": "def _extract_current_injection(content)"}, {"kind": "method", "line": 126, "name": "_remove_old_injection", "signature": "def _remove_old_injection(content)"}, {"kind": "method", "line": 136, "name": "remove", "signature": "def remove(self, project_root)"}, {"kind": "method", "line": 165, "name": "_find_readme", "signature": "def _find_readme(root)"}, {"kind": "method", "line": 172, "name": "_build_injection", "signature": "def _build_injection(self, suffix)"}]}, {"doc": "Monolithic file refactoring planner for the readmenator knowledge graph.  Identifies large files exceeding configurable thresholds and generates deterministic refactoring plans based on symbol extraction and cohesive cluster detection. Never auto-executes; only produces plans.", "id": "readmenator/_refactorizer.py", "kind": "module", "label": "_refactorizer.py", "language": "py", "sha256": "e7441939d0acf9ea", "symbol_count": 9, "symbols": [{"doc": "Generates refactoring plans for monolithic files.\n\nAnalyzes files exceeding the line threshold, extracts symbol\nboundaries, detects cohesive clusters via import analysis, and\nproduces structured refactoring plans without auto-execution.", "kind": "class", "line": 24, "name": "MonolithRefactorizer", "signature": "class MonolithRefactorizer"}, {"kind": "method", "line": 32, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Identify monolithic files and generate refactoring plans.\n\nArgs:\n    nodes: Scanned file nodes.\n    edges: Import edges.\n    resolved_edges: Optional resolved-import edges.\n    content_map: Optional mapping from node_id to file content.\n\nReturns:\n    List of RefactoringPlan instances for files needing refactoring.", "kind": "method", "line": 35, "name": "analyze", "signature": "def analyze(self, nodes, edges, resolved_edges, content_map)"}, {"kind": "method", "line": 70, "name": "_get_line_count", "signature": "def _get_line_count(self, file_id, content_map)"}, {"kind": "method", "line": 82, "name": "_plan_refactoring", "signature": "def _plan_refactoring(self, node, edges, resolved_edges, content_map)"}, {"kind": "method", "line": 126, "name": "_group_symbols_by_kind", "signature": "def _group_symbols_by_kind(self, symbols)"}, {"kind": "method", "line": 132, "name": "_suggest_target_file", "signature": "def _suggest_target_file(self, source_file, kind)"}, {"kind": "method", "line": 147, "name": "_estimate_impact", "signature": "def _estimate_impact(self, file_id, resolved_edges)"}, {"kind": "method", "line": 156, "name": "generate_script", "signature": "def generate_script(self, plan, project_root)"}]}, {"doc": "Import path resolver for the readmenator knowledge graph.  Maps raw import strings (e.g. ``\"os\"``, ``\"../utils\"``, ``\"java.util.List\"``) to actual file node IDs within the scanned project so that dependency- tracing operations work on concrete files rather than opaque strings.", "id": "readmenator/_resolver.py", "kind": "module", "label": "_resolver.py", "language": "py", "sha256": "a1e4b13df0c80b33", "symbol_count": 17, "symbols": [{"doc": "Resolves raw import strings to project file paths.\n\nUses heuristics tuned to each language's import conventions:\nPython dots to slashes, Java dots to directory separators,\nrelative-path resolution, and extensionless module detection.", "kind": "class", "line": 18, "name": "ImportResolver", "signature": "class ImportResolver"}, {"doc": "Initialise the resolver with all known file paths.\n\nArgs:\n    file_ids: List of relative file paths from the scan.\n    root: Root directory for relative-path resolution.\n    extensions: Known source extensions, defaults to Config.\n    include_dirs: Extra include search dirs (``-I`` style).", "kind": "method", "line": 61, "name": "__init__", "signature": "def __init__(self, file_ids, root, extensions, include_dirs)"}, {"doc": "Map file stems (without extension) to their full paths.", "kind": "method", "line": 83, "name": "_build_stem_index", "signature": "def _build_stem_index(self, file_ids)"}, {"doc": "Map directory paths to the files they contain.", "kind": "method", "line": 93, "name": "_build_dir_index", "signature": "def _build_dir_index(self, file_ids)"}, {"doc": "Resolve an import string to a concrete project file path.\n\nArgs:\n    import_str: The raw import string from the parser.\n    source_file: The file that contains the import (for relative resolution).\n\nReturns:\n    Matching file node ID or ``None`` if no match found.", "kind": "method", "line": 110, "name": "resolve", "signature": "def resolve(self, import_str, source_file)"}, {"doc": "Resolve *import_str* to all possible matching project file paths.\n\nArgs:\n    import_str: The raw import string.\n    source_file: The file that contains the import.\n\nReturns:\n    List of matching file node IDs (may be empty).", "kind": "method", "line": 163, "name": "resolve_all", "signature": "def resolve_all(self, import_str, source_file)"}, {"doc": "Resolve *import_str* against configured ``-I`` include dirs.\n\nArgs:\n    import_str: Raw header path without ``sys:`` prefix.\n\nReturns:\n    Matching file node ID or ``None``.", "kind": "method", "line": 179, "name": "_resolve_include_dirs", "signature": "def _resolve_include_dirs(self, import_str)"}, {"doc": "Resolve a relative import (starts with ``.`` or ``..``).", "kind": "method", "line": 199, "name": "_resolve_relative", "signature": "def _resolve_relative(self, import_str, source_file)"}, {"doc": "Resolve a path-like import verbatim against the source directory.\n\nCovers quoted C-family includes such as ``\"utils.h\"`` or\n``\"lib/net.h\"`` which name a project file relative to the\nincluding file.", "kind": "method", "line": 217, "name": "_resolve_verbatim", "signature": "def _resolve_verbatim(self, import_str, source_file)"}, {"doc": "Resolve a bare module name by appending known extensions.", "kind": "method", "line": 235, "name": "_resolve_extensionless", "signature": "def _resolve_extensionless(self, import_str, source_file)"}, {"doc": "Resolve as a package directory with __init__ or index file.", "kind": "method", "line": 244, "name": "_resolve_directory_init", "signature": "def _resolve_directory_init(self, import_str, source_file)"}, {"doc": "Resolve a bare top-level name to a root package ``__init__.py``.\n\nPython prefers a package directory over a same-named module, so\n``import pkg`` must map to ``pkg/__init__.py`` even when a\n``pkg.py`` launcher shim exists; stem matching would otherwise\npick the shim and fabricate dependency cycles.", "kind": "method", "line": 254, "name": "_resolve_root_package", "signature": "def _resolve_root_package(self, import_str)"}, {"doc": "Resolve a dotted module path (Python/Java convention).", "kind": "method", "line": 269, "name": "_resolve_module_dotpath", "signature": "def _resolve_module_dotpath(self, import_str)"}, {"doc": "Match a slash-qualified include against project path suffixes.\n\nCovers include-directory style references such as\n``\"kernel/mm.h\"`` mapping to ``\"include/kernel/mm.h\"``. Only\nunambiguous matches resolve.", "kind": "method", "line": 291, "name": "_resolve_suffix_match", "signature": "def _resolve_suffix_match(self, import_str)"}, {"doc": "Match by exact file basename including extension.\n\nCovers the classic C pair pattern where ``kernel.h`` is\nincluded but ``kernel.c`` shares its stem: stem matching\nstays ambiguous while the basename is unique. Only\nunambiguous matches resolve.", "kind": "method", "line": 306, "name": "_resolve_basename_match", "signature": "def _resolve_basename_match(self, import_str)"}, {"doc": "Match by file stem only (last resort).", "kind": "method", "line": 324, "name": "_resolve_stem_match", "signature": "def _resolve_stem_match(self, import_str)"}, {"doc": "Remove a trailing known source extension from a file name.\n\nArgs:\n    name: Base file name which may carry an extension.\n\nReturns:\n    The file stem used for stem index lookups.", "kind": "method", "line": 333, "name": "_strip_extension", "signature": "def _strip_extension(self, name)"}]}, {"doc": "Suggested linting rule generator producing Semgrep YAML from detected antipatterns.", "id": "readmenator/_rule_gen.py", "kind": "module", "label": "_rule_gen.py", "language": "py", "sha256": "40dca3acec597dd6", "symbol_count": 9, "symbols": [{"doc": "Generates suggested linting and security rules from code patterns.\n\nAnalyses the scanned codebase for repeated patterns that suggest\nproject-specific linting rules: bare except clauses, repeated\ntype annotations, common security antipatterns, and naming\nconvention violations. Outputs Semgrep YAML rules to a directory.", "kind": "class", "line": 14, "name": "RuleGenerator", "signature": "class RuleGenerator"}, {"kind": "method", "line": 90, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Generate suggested rules by scanning code patterns.\n\nArgs:\n    nodes: Scanned file nodes with symbols.\n    content_map: Optional mapping of file paths to their source content\n        for deeper pattern matching.\n\nReturns:\n    List of SuggestedRule instances.", "kind": "method", "line": 94, "name": "generate", "signature": "def generate(self, nodes, content_map)"}, {"doc": "Write suggested rules to Semgrep YAML files in output_dir.\n\nReturns the number of rule files written.", "kind": "method", "line": 122, "name": "write_rules", "signature": "def write_rules(self, rules, output_dir)"}, {"doc": "Group nodes by their language extension.", "kind": "method", "line": 161, "name": "_group_by_language", "signature": "def _group_by_language(self, nodes)"}, {"doc": "Analyze a single language group for rule suggestions.", "kind": "method", "line": 171, "name": "_analyze_language", "signature": "def _analyze_language(self, lang, nodes, content_map)"}, {"doc": "Detect known antipatterns across all files.", "kind": "method", "line": 204, "name": "_detect_antipatterns", "signature": "def _detect_antipatterns(self, nodes, content_map)"}, {"doc": "Infer target language for a built-in antipattern rule.", "kind": "method", "line": 250, "name": "_infer_language_for_rule", "signature": "def _infer_language_for_rule(rule_id)"}, {"doc": "Generate the next rule identifier.", "kind": "method", "line": 260, "name": "_next_rule_id", "signature": "def _next_rule_id(self)"}]}, {"doc": "SARIF v2.1.0 exporter for security findings (GitHub Code Scanning compatible).", "id": "readmenator/_sarif.py", "kind": "module", "label": "_sarif.py", "language": "py", "sha256": "9cf9cfcb63cbe38c", "symbol_count": 5, "symbols": [{"doc": "Exports security findings to the SARIF standard format.\n\nSARIF is an OASIS standard format for static analysis tool output.\nThis exporter produces SARIF v2.1.0 JSON compatible with GitHub\nCode Scanning, VS Code SARIF viewer, and other SARIF consumers.", "kind": "class", "line": 11, "name": "SarifExporter", "signature": "class SarifExporter"}, {"kind": "method", "line": 30, "name": "__init__", "signature": "def __init__(self, privacy_mode)"}, {"doc": "Generate a SARIF v2.1.0 JSON string from security findings.\n\nArgs:\n    findings: List of SecurityFinding instances.\n    project_name: Name of the scanned project for metadata.\n\nReturns:\n    SARIF JSON string.", "kind": "method", "line": 33, "name": "export", "signature": "def export(self, findings, project_name)"}, {"doc": "Build a SARIF reportingDescriptor (rule) object.", "kind": "method", "line": 82, "name": "_build_rule", "signature": "def _build_rule(self, finding)"}, {"doc": "Build a SARIF result object for a single finding.", "kind": "method", "line": 106, "name": "_build_result", "signature": "def _build_result(self, finding, rule_index)"}]}, {"doc": "Secure polyglot directory traversal and file analysis.  The scanner walks a directory tree, applies security and size checks, resolves each supported file through ParserFactory, and returns a flat list of Node and Edge objects that form the knowledge graph.", "id": "readmenator/_scanner.py", "kind": "module", "label": "_scanner.py", "language": "py", "sha256": "6e77318175215be7", "symbol_count": 14, "symbols": [{"doc": "Recursive directory scanner with security and size guards.\n\nRejects symlinks, enforces file-size and directory-depth limits,\nskips ignored directories, and silently catches parse errors\nso a single misbehaving file never breaks the full scan.\n\nSupports privacy mode (strips snippets and docstrings) and\ngitignore-aware scanning for more accurate project coverage.", "kind": "class", "line": 28, "name": "PolyglotScanner", "signature": "class PolyglotScanner"}, {"doc": "Initialise the scanner with application configuration.\n\nArgs:\n    config: Settings including ignore dirs, size limits, etc.", "kind": "method", "line": 39, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Return ``True`` if any path component matches IGNORE_DIRS.", "kind": "method", "line": 50, "name": "_is_ignored", "signature": "def _is_ignored(self, path)"}, {"doc": "Return ``True`` for artifacts readmenator itself wrote into the project.\n\nRescanning its own output (agent docs, wiki, rules, maps, refactor\nscripts) would feed generated noise back into the graph and skew\nindexes, centrality, and purposes on every rebuild.\n\nArgs:\n    rel_path: Path relative to the scan root.\n\nReturns:\n    Whether the path belongs to a readmenator-generated artifact.", "kind": "method", "line": 57, "name": "_is_generated", "signature": "def _is_generated(self, rel_path)"}, {"doc": "Parse .gitignore patterns using regex (no external deps).", "kind": "method", "line": 83, "name": "_load_gitignore", "signature": "def _load_gitignore(self, root)"}, {"doc": "Convert a .gitignore glob pattern to a regex pattern.", "kind": "method", "line": 105, "name": "_gitignore_glob_to_regex", "signature": "def _gitignore_glob_to_regex(pattern)"}, {"doc": "Check if a relative path matches any .gitignore pattern.", "kind": "method", "line": 145, "name": "_is_gitignored", "signature": "def _is_gitignored(self, rel_path)"}, {"doc": "Reject symlinks and files exceeding MAX_FILE_SIZE_MB.", "kind": "method", "line": 154, "name": "_validate_path_security", "signature": "def _validate_path_security(self, path)"}, {"doc": "Return ``True`` if *path* is within MAX_DIRECTORY_DEPTH of *root*.", "kind": "method", "line": 167, "name": "_check_directory_depth", "signature": "def _check_directory_depth(self, path, root)"}, {"doc": "Extract a file-level docstring from the first lines of a source file.\n\nWalks the first FILE_HEADER_MAX_LINES lines looking for a contiguous\nblock of comments, a Python module docstring, or a shebang followed\nby comments. Returns the concatenated comment text.\n\nArgs:\n    content: Raw file content as a string.\n\nReturns:\n    Extracted file-level docstring or empty string.", "kind": "method", "line": 175, "name": "_extract_file_doc", "signature": "def _extract_file_doc(self, content)"}, {"doc": "Emit a progress message every PROGRESS_REPORT_BATCH files.\n\nArgs:\n    count: Number of files scanned so far.", "kind": "method", "line": 251, "name": "_emit_progress", "signature": "def _emit_progress(self, count)"}, {"doc": "Walk *root* recursively and produce (nodes, edges) for the graph.\n\nSecurity checks (symlinks, size, depth, ignore dirs) are applied\nper file. Parse failures are silently caught so a single broken\nfile never blocks the rest of the scan.\n\nReturns:\n    A tuple of (list of Node, list of Edge). Edges represent\n    ``imports`` relationships between scanned files.", "kind": "method", "line": 261, "name": "scan", "signature": "def scan(self, root)"}, {"doc": "Scan and also return raw file contents for deeper analysis.\n\nReturns:\n    Tuple of (nodes, edges, content_map) where content_map maps\n    node_id to raw file content.", "kind": "method", "line": 275, "name": "scan_with_content", "signature": "def scan_with_content(self, root)"}, {"doc": "Internal scan implementation returning nodes, edges, and content.", "kind": "method", "line": 286, "name": "_scan_impl", "signature": "def _scan_impl(self, root)"}]}, {"doc": "Pattern-based static security analysis for the readmenator knowledge graph.  Scans source files across all supported languages for dangerous patterns: command injection, SQL injection, XSS, weak crypto, unsafe deserialization, hardcoded secrets, and more. Pure regex-based, zero external dependencies.  Rules are loaded from readmenator-rules/_security_rules.yml at runtime, eliminating hardcoded patterns from source code (per the externalization principle). Falls back to built-in rules if the YAML file is not present.", "id": "readmenator/_security.py", "kind": "module", "label": "_security.py", "language": "py", "sha256": "a51d57d73c52ac05", "symbol_count": 32, "symbols": [{"doc": "A single security detection rule loaded from YAML or built-in.\n\nAttributes:\n    rule_id: Unique identifier (e.g. \"PY001\").\n    severity: Severity level (critical, high, medium, low, info).\n    description: Human-readable description of the issue.\n    pattern: Compiled regex to search for.\n    cwe: CWE identifier string.\n    mitre_attack: MITRE ATT&CK technique ID (e.g. \"T1059.001\").", "kind": "class", "line": 24, "name": "SecurityRule", "signature": "class SecurityRule"}, {"doc": "Parse the simplified YAML format used by _security_rules.yml.\n\nOnly supports:\n  - top-level ``rules:`` key\n  - list items starting with ``  - rule_id:``\n  - scalar key: value pairs (quoted or unquoted)\n  - block list items: ``    - \"value\"``\n  - inline lists: ``key: [item1, item2]``\n  - ``#`` comments\n\nReturns a list of rule dicts.", "kind": "method", "line": 46, "name": "_parse_minimal_yaml", "signature": "def _parse_minimal_yaml(text)"}, {"kind": "method", "line": 121, "name": "_unquote", "signature": "def _unquote(s)"}, {"doc": "Load rule dicts from the YAML rules file, or return None on failure.", "kind": "method", "line": 128, "name": "_load_rules_from_yaml", "signature": "def _load_rules_from_yaml(yaml_path)"}, {"kind": "method", "line": 148, "name": "_compile", "signature": "def _compile()"}, {"kind": "method", "line": 153, "name": "_python_rules", "signature": "def _python_rules()"}, {"kind": "method", "line": 182, "name": "_javascript_rules", "signature": "def _javascript_rules()"}, {"kind": "method", "line": 201, "name": "_c_rules", "signature": "def _c_rules()"}, {"kind": "method", "line": 222, "name": "_java_rules", "signature": "def _java_rules()"}, {"kind": "method", "line": 237, "name": "_go_rules", "signature": "def _go_rules()"}, {"kind": "method", "line": 250, "name": "_ruby_rules", "signature": "def _ruby_rules()"}, {"kind": "method", "line": 267, "name": "_php_rules", "signature": "def _php_rules()"}, {"kind": "method", "line": 284, "name": "_shell_rules", "signature": "def _shell_rules()"}, {"kind": "method", "line": 297, "name": "_csharp_rules", "signature": "def _csharp_rules()"}, {"kind": "method", "line": 310, "name": "_kotlin_rules", "signature": "def _kotlin_rules()"}, {"kind": "method", "line": 321, "name": "_swift_rules", "signature": "def _swift_rules()"}, {"kind": "method", "line": 332, "name": "_scala_rules", "signature": "def _scala_rules()"}, {"kind": "method", "line": 343, "name": "_lua_rules", "signature": "def _lua_rules()"}, {"kind": "method", "line": 354, "name": "_dart_rules", "signature": "def _dart_rules()"}, {"kind": "method", "line": 365, "name": "_rust_rules", "signature": "def _rust_rules()"}, {"kind": "method", "line": 376, "name": "_nim_rules", "signature": "def _nim_rules()"}, {"kind": "method", "line": 387, "name": "_gdscript_rules", "signature": "def _gdscript_rules()"}, {"kind": "method", "line": 398, "name": "_elixir_rules", "signature": "def _elixir_rules()"}, {"doc": "Attempt to build the rule map from the YAML rules file.\n\nReturns None if the YAML file cannot be loaded or parsed, allowing\nthe caller to fall back to built-in rules.", "kind": "method", "line": 447, "name": "_build_rules_from_yaml", "signature": "def _build_rules_from_yaml(yaml_path)"}, {"doc": "Pattern-based static security scanner.\n\nLoads rules from the external YAML rules file when available,\nfalling back to the built-in hardcoded rule sets. Walks the\ntarget directory applying rules to every supported source file.", "kind": "class", "line": 486, "name": "SecurityAnalyzer", "signature": "class SecurityAnalyzer"}, {"doc": "Return a one-line remediation hint for a security finding.\n\nLooks up the finding CWE in the guidance map and falls back to a\ngeneric least-privilege hint for unmapped identifiers.\n\nArgs:\n    finding: Security finding with a CWE identifier string.\n\nReturns:\n    One-line remediation hint without markdown formatting.", "kind": "method", "line": 620, "name": "fix_hint_for", "signature": "def fix_hint_for(finding)"}, {"kind": "method", "line": 496, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Resolve rules: prefer YAML, fall back to built-in.", "kind": "method", "line": 500, "name": "_resolve_rules", "signature": "def _resolve_rules(self)"}, {"kind": "method", "line": 509, "name": "_meets_threshold", "signature": "def _meets_threshold(self, severity)"}, {"kind": "method", "line": 513, "name": "scan", "signature": "def scan(self, root)"}, {"kind": "method", "line": 555, "name": "_validate_path", "signature": "def _validate_path(self, path, root)"}, {"kind": "method", "line": 572, "name": "summary", "signature": "def summary(self, findings)"}]}, {"doc": "Taint propagation analysis of dangerous imports through the resolved import graph.", "id": "readmenator/_taint.py", "kind": "module", "label": "_taint.py", "language": "py", "sha256": "e5d5f3447e3207de", "symbol_count": 6, "symbols": [{"doc": "Propagation-based taint analysis over the resolved import graph.\n\nIdentifies files that import known-dangerous modules or functions\n(sources) and traces how that danger propagates through the import\ngraph to files that never directly import the dangerous module\nbut receive taint through transitive dependencies.", "kind": "class", "line": 12, "name": "TaintAnalyzer", "signature": "class TaintAnalyzer"}, {"kind": "method", "line": 73, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Run taint propagation analysis on the codebase.\n\nScans all nodes for direct dangerous imports, then propagates\ntaint through the resolved import graph. Returns all discovered\ntaint paths from sources to sinks.", "kind": "method", "line": 77, "name": "analyze", "signature": "def analyze(self, nodes, edges, resolved_edges)"}, {"doc": "Find files that directly import known-dangerous modules.", "kind": "method", "line": 136, "name": "_find_direct_sources", "signature": "def _find_direct_sources(self, nodes, edges)"}, {"doc": "BFS propagation from source through the import graph.", "kind": "method", "line": 162, "name": "_propagate", "signature": "def _propagate(self, source_node_id, danger_import, adj, nodes, max_depth)"}, {"doc": "Build a forward-directed import graph from resolved edges.", "kind": "method", "line": 213, "name": "_build_forward_graph", "signature": "def _build_forward_graph(nodes, resolved_edges)"}]}, {"doc": "UML class diagram renderer (Mermaid classDiagram) and 12-language stub generator.", "id": "readmenator/_uml.py", "kind": "module", "label": "_uml.py", "language": "py", "sha256": "1c08f1d5566773e1", "symbol_count": 25, "symbols": [{"kind": "class", "line": 34, "name": "UmlGenerator", "signature": "class UmlGenerator"}, {"kind": "method", "line": 172, "name": "_get_code_generator", "signature": "def _get_code_generator(language)"}, {"kind": "method", "line": 190, "name": "_type_map_py_to_target", "signature": "def _type_map_py_to_target(target, py_type_hint)"}, {"kind": "method", "line": 233, "name": "_generate_cpp", "signature": "def _generate_cpp(class_symbols, nodes, edges)"}, {"kind": "method", "line": 259, "name": "_cpp_params", "signature": "def _cpp_params(params)"}, {"kind": "method", "line": 274, "name": "_generate_java", "signature": "def _generate_java(class_symbols, nodes, edges)"}, {"kind": "method", "line": 301, "name": "_java_params", "signature": "def _java_params(params)"}, {"kind": "method", "line": 316, "name": "_generate_csharp", "signature": "def _generate_csharp(class_symbols, nodes, edges)"}, {"kind": "method", "line": 345, "name": "_cs_params", "signature": "def _cs_params(params)"}, {"kind": "method", "line": 360, "name": "_generate_python", "signature": "def _generate_python(class_symbols, nodes, edges)"}, {"kind": "method", "line": 395, "name": "_generate_go", "signature": "def _generate_go(class_symbols, nodes, edges)"}, {"kind": "method", "line": 422, "name": "_generate_rust", "signature": "def _generate_rust(class_symbols, nodes, edges)"}, {"kind": "method", "line": 448, "name": "_generate_php", "signature": "def _generate_php(class_symbols, nodes, edges)"}, {"kind": "method", "line": 476, "name": "_generate_kotlin", "signature": "def _generate_kotlin(class_symbols, nodes, edges)"}, {"kind": "method", "line": 496, "name": "_generate_scala", "signature": "def _generate_scala(class_symbols, nodes, edges)"}, {"kind": "method", "line": 518, "name": "_generate_swift", "signature": "def _generate_swift(class_symbols, nodes, edges)"}, {"kind": "method", "line": 547, "name": "_generate_dart", "signature": "def _generate_dart(class_symbols, nodes, edges)"}, {"kind": "method", "line": 567, "name": "_generate_ruby", "signature": "def _generate_ruby(class_symbols, nodes, edges)"}, {"kind": "method", "line": 588, "name": "_safe_name", "signature": "def _safe_name(name)"}, {"kind": "method", "line": 592, "name": "_extract_params", "signature": "def _extract_params(signature)"}, {"kind": "method", "line": 36, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 39, "name": "render_mermaid_class_diagram", "signature": "def render_mermaid_class_diagram(self, nodes, edges)"}, {"kind": "method", "line": 129, "name": "generate_code", "signature": "def generate_code(self, nodes, edges, target_language)"}, {"kind": "method", "line": 153, "name": "_sanitize_id", "signature": "def _sanitize_id(raw)"}, {"kind": "method", "line": 165, "name": "_find_node", "signature": "def _find_node(nodes, node_id)"}]}, {"doc": "Cinematic codebase overview video, general purpose.  Renders a short synthwave explainer for any project analysed by readmenator, in the visual language of the miniGCC self-host video (neon HUD panels, striped sun, scrolling grid, bloom, scanlines, chromatic text, glitch transitions). Every number on screen comes from a real scan: file/symbol/import counts, detected layers, god nodes, communities, the resolved import graph, per-file hash colors and top security findings.  Zero tokens: pure PIL frame drawing piped to ffmpeg. Optional dependency: when PIL or ffmpeg is missing the caller skips with a warning instead of failing the rebuild.", "id": "readmenator/_video.py", "kind": "module", "label": "_video.py", "language": "py", "sha256": "cda664fd11996138", "symbol_count": 49, "symbols": [{"doc": "Smoothstep clamped to [0, 1].", "kind": "function", "line": 73, "name": "ease", "signature": "def ease(x)"}, {"doc": "Group thousands with commas.", "kind": "function", "line": 79, "name": "fmt_int", "signature": "def fmt_int(n)"}, {"doc": "Linear blend of two RGB colors.", "kind": "function", "line": 84, "name": "mix", "signature": "def mix(a, b, t)"}, {"doc": "RGB color plus an alpha in [0, 1] as an RGBA tuple.", "kind": "function", "line": 89, "name": "alpha", "signature": "def alpha(c, a)"}, {"doc": "Neon color derived from a digest: the file fingerprint.", "kind": "function", "line": 94, "name": "hash_color", "signature": "def hash_color(digest)"}, {"doc": "Truncate a label to a character budget without newlines.", "kind": "function", "line": 103, "name": "short_label", "signature": "def short_label(text, limit)"}, {"doc": "Main content panel fitted to the configured canvas.", "kind": "function", "line": 111, "name": "_panel", "signature": "def _panel(cfg)"}, {"doc": "Y coordinate of the lower-third narration line.", "kind": "function", "line": 116, "name": "_caption_y", "signature": "def _caption_y(cfg)"}, {"doc": "Graph panel plus telemetry side panel fitted to the canvas.", "kind": "function", "line": 121, "name": "_graph_boxes", "signature": "def _graph_boxes(cfg)"}, {"doc": "DNA grid panel plus security side panel fitted to the canvas.", "kind": "function", "line": 130, "name": "_dna_boxes", "signature": "def _dna_boxes(cfg)"}, {"doc": "Left content panel plus right detail panel fitted to the canvas.", "kind": "function", "line": 139, "name": "_split_boxes", "signature": "def _split_boxes(cfg)"}, {"doc": "Pulsing verdict badge pinned to the bottom of a panel.", "kind": "function", "line": 148, "name": "_verdict_badge", "signature": "def _verdict_badge(d, box, text, fonts, lt, dur, col)"}, {"doc": "Vertical sweep line travelling across a panel.", "kind": "function", "line": 163, "name": "_scan_cursor", "signature": "def _scan_cursor(d, box, progress, col)"}, {"doc": "Single-color tint for a source line: comments dim, code bright.", "kind": "function", "line": 172, "name": "_code_tint", "signature": "def _code_tint(line)"}, {"doc": "Deterministic phase offset for a packet travelling edge a->b.", "kind": "function", "line": 182, "name": "_packet_offset", "signature": "def _packet_offset(a, b, k)"}, {"doc": "Check that PIL and ffmpeg exist for video rendering.", "kind": "function", "line": 188, "name": "dependencies_available", "signature": "def dependencies_available()"}, {"doc": "Resolve monospace fonts through fontconfig with PIL fallback.", "kind": "function", "line": 197, "name": "resolve_fonts", "signature": "def resolve_fonts()"}, {"doc": "Precomputed synthwave background with sun and CRT mask.", "kind": "class", "line": 236, "name": "Backdrop", "signature": "class Backdrop"}, {"doc": "Import PIL Image lazily for optional-dependency support.", "kind": "method", "line": 292, "name": "_img", "signature": "def _img()"}, {"doc": "Draw the scrolling perspective grid below the horizon.", "kind": "method", "line": 299, "name": "draw_grid", "signature": "def draw_grid(img, t, strength, bd)"}, {"doc": "Paste the striped synthwave sun behind the horizon.", "kind": "method", "line": 319, "name": "draw_sun", "signature": "def draw_sun(img, a, bd, cy)"}, {"doc": "Apply bloom, scanlines, vignette and optional glitch.", "kind": "method", "line": 336, "name": "post", "signature": "def post(img, glitch, seed)"}, {"doc": "RGB split plus horizontal slice displacement.", "kind": "method", "line": 354, "name": "glitch_fx", "signature": "def glitch_fx(img, amount, seed)"}, {"doc": "Draw text with red/cyan CRT chromatic aberration.", "kind": "method", "line": 377, "name": "chroma_text", "signature": "def chroma_text(img, xy, text, font, col, spread, anchor)"}, {"doc": "Draw a translucent HUD panel with neon edge and corner brackets.", "kind": "method", "line": 388, "name": "hud_panel", "signature": "def hud_panel(d, box, title, fonts, col)"}, {"doc": "Draw the top strip with project title, act label and progress.", "kind": "method", "line": 401, "name": "draw_header", "signature": "def draw_header(img, d, gt, total, project, act_label, fonts, width)"}, {"doc": "Draw the lower-third narration line with typing effect.", "kind": "method", "line": 415, "name": "draw_caption", "signature": "def draw_caption(d, text, lt, dur, fonts, width, y)"}, {"doc": "Builds and renders the general-purpose codebase overview video.", "kind": "class", "line": 431, "name": "CinematicVideoRenderer", "signature": "class CinematicVideoRenderer"}, {"doc": "Pool worker: draw one frame and return raw RGB bytes.", "kind": "method", "line": 752, "name": "_render_frame_bytes", "signature": "def _render_frame_bytes(fi)"}, {"doc": "Draw one frame for the global render state.", "kind": "method", "line": 757, "name": "_draw_frame", "signature": "def _draw_frame(fi)"}, {"doc": "Cold open with counting project stats and language chips.", "kind": "method", "line": 785, "name": "_scene_title", "signature": "def _scene_title(img, d, lt, gt, sc)"}, {"doc": "Act interstitial card.", "kind": "method", "line": 820, "name": "_scene_card", "signature": "def _scene_card(img, d, lt, gt, sc)"}, {"doc": "Animated horizontal bars for the 5-layer model with sweep cursor.", "kind": "method", "line": 834, "name": "_scene_layers", "signature": "def _scene_layers(img, d, lt, gt, sc)"}, {"doc": "Ranked god nodes with the formula exposed plus real source preview.", "kind": "method", "line": 859, "name": "_scene_gods", "signature": "def _scene_gods(img, d, lt, gt, sc)"}, {"doc": "The true dependency tree: BFS spanning tree grown from the hub file.", "kind": "method", "line": 902, "name": "_scene_tree", "signature": "def _scene_tree(img, d, lt, gt, sc)"}, {"doc": "Community cards explaining why each group sticks together.", "kind": "method", "line": 963, "name": "_scene_communities", "signature": "def _scene_communities(img, d, lt, gt, sc)"}, {"doc": "The resolved import graph growing node by node, with live packets.", "kind": "method", "line": 1006, "name": "_scene_graph", "signature": "def _scene_graph(img, d, lt, gt, sc)"}, {"doc": "Every file as a color, scanned live, with a zoom on the hub file.", "kind": "method", "line": 1064, "name": "_scene_dna", "signature": "def _scene_dna(img, d, lt, gt, sc)"}, {"doc": "Closing summary with the measured numbers.", "kind": "method", "line": 1119, "name": "_scene_outro", "signature": "def _scene_outro(img, d, lt, gt, sc)"}, {"doc": "Find one font file for a style, else None.", "kind": "method", "line": 201, "name": "_find", "signature": "def _find(style)"}, {"doc": "Build the gradient sky, star field, sun and CRT mask.", "kind": "method", "line": 239, "name": "__init__", "signature": "def __init__(self, width, height)"}, {"doc": "Build the striped synthwave sun sprite.", "kind": "method", "line": 277, "name": "_sun", "signature": "def _sun(self, r)"}, {"doc": "Collect every number each scene draws, from real scan data.", "kind": "method", "line": 436, "name": "collect", "signature": "def collect(self, nodes, edges, resolved_edges, analysis, layers, findings, analysis_v2, project_name, content_map)"}, {"doc": "Grow a true dependency spanning tree with BFS from the hub file.", "kind": "method", "line": 572, "name": "_build_dep_tree", "signature": "def _build_dep_tree(self, node_by_id, link_set, god_names)"}, {"doc": "Lay every scene on the global clock.", "kind": "method", "line": 612, "name": "build_scenes", "signature": "def build_scenes(self, data)"}, {"doc": "Compute deterministic positions for graph nodes inside a box.", "kind": "method", "line": 638, "name": "graph_positions", "signature": "def graph_positions(self, data, box)"}, {"doc": "Compute tidy tree positions for the BFS dependency tree.", "kind": "method", "line": 673, "name": "tree_positions", "signature": "def tree_positions(self, data, box)"}, {"doc": "Render one frame to raw RGB bytes without touching ffmpeg.", "kind": "method", "line": 694, "name": "render_single_frame", "signature": "def render_single_frame(self, data, frame_index)"}, {"doc": "Render all frames and encode to mp4, muxing music if configured.", "kind": "method", "line": 712, "name": "render", "signature": "def render(self, data, output_path)"}]}, {"doc": "Filesystem watcher for auto-rebuilding the knowledge base.  Monitors the project directory for file changes and triggers automatic regeneration of KNOWLEDGE_BASE.md. Uses polling with configurable interval to avoid external dependencies.", "id": "readmenator/_watcher.py", "kind": "module", "label": "_watcher.py", "language": "py", "sha256": "239589d6f7746a2a", "symbol_count": 5, "symbols": [{"doc": "Polling-based directory watcher for auto-rebuild on changes.\n\nComputes a combined hash of all tracked files (filenames + sizes)\nand triggers a callback when the hash changes. Uses polling to\navoid external dependencies like watchdog or inotify.", "kind": "class", "line": 21, "name": "DirectoryWatcher", "signature": "class DirectoryWatcher"}, {"doc": "Initialise the watcher for a project root.\n\nArgs:\n    root: Project directory to watch.\n    config: Application configuration.\n    callback: Function called when changes are detected.\n    interval_seconds: Polling interval in seconds.", "kind": "method", "line": 29, "name": "__init__", "signature": "def __init__(self, root, config, callback, interval_seconds)"}, {"doc": "Compute a quick hash of all tracked files in the project.\n\nUses file paths and sizes (not full content) for speed.\nReturns a hex digest that changes when files are added,\nremoved, or modified.", "kind": "method", "line": 51, "name": "_compute_snapshot", "signature": "def _compute_snapshot(self)"}, {"doc": "Start watching the directory (blocking).", "kind": "method", "line": 80, "name": "start", "signature": "def start(self)"}, {"doc": "Stop watching.", "kind": "method", "line": 97, "name": "stop", "signature": "def stop(self)"}]}, {"doc": "Deterministic agent wiki generator for readmenator.  Builds a navigable, progressively disclosed wiki on top of the scanned knowledge graph. The layout mirrors the Karpathy LLM Wiki Pattern used by graphify and second-brain (index plus one page per community plus machine-readable connections), but every page is synthesised deterministically from static analysis with zero LLM calls, zero tokens, and an honest confidence trail.  Output layout::  readmenator-wiki/ ├── index.md              # entry point: overview plus all links ├── community_<id>_<slug>.md  # one synthesis page per community ├── connections.json      # typed bridges with strength and confidence ├── queries.md            # suggested questions plus answer log └── REPORT.md             # honest audit: coverage, confidence, limits", "id": "readmenator/_wiki.py", "kind": "module", "label": "_wiki.py", "language": "py", "sha256": "413693197c57ef5a", "symbol_count": 31, "symbols": [{"doc": "Return True for file-doc first lines that state no purpose.", "kind": "function", "line": 47, "name": "_is_garbage_purpose", "signature": "def _is_garbage_purpose(text)"}, {"doc": "Return a filesystem-safe slug for community labels.", "kind": "function", "line": 55, "name": "_slug", "signature": "def _slug(text)"}, {"doc": "Return community id pairs already linked, to avoid duplicate edges.", "kind": "function", "line": 62, "name": "existing_ids", "signature": "def existing_ids(connections)"}, {"doc": "Return unique display names, disambiguating duplicate labels.", "kind": "function", "line": 72, "name": "_display_names", "signature": "def _display_names(communities)"}, {"doc": "Generates the navigable agent wiki from scanned topology.", "kind": "class", "line": 86, "name": "WikiGenerator", "signature": "class WikiGenerator"}, {"doc": "Store configuration for wiki output limits and paths.", "kind": "method", "line": 89, "name": "__init__", "signature": "def __init__(self, config)"}, {"doc": "Write all wiki files and return the output directory path.", "kind": "method", "line": 94, "name": "generate", "signature": "def generate(self, nodes, edges, resolved_edges, analysis, layers, findings, analysis_v2, project_root)"}, {"doc": "Delete community pages from previous runs that are no longer generated.", "kind": "method", "line": 142, "name": "_prune_stale_pages", "signature": "def _prune_stale_pages(self, out_dir, current)"}, {"doc": "Check wiki health and return a list of issue descriptions.", "kind": "method", "line": 151, "name": "lint", "signature": "def lint(self, project_root)"}, {"doc": "Return detected communities plus an orphan fallback for leftovers.", "kind": "method", "line": 174, "name": "_resolve_communities", "signature": "def _resolve_communities(self, nodes, analysis, resolved)"}, {"doc": "Return the community containing the given node id.", "kind": "method", "line": 200, "name": "_community_of", "signature": "def _community_of(self, node_id, communities)"}, {"doc": "Derive typed bridges between communities with strength scores.", "kind": "method", "line": 209, "name": "_build_connections", "signature": "def _build_connections(self, communities, resolved, analysis, node_map, layers)"}, {"doc": "Flag community pairs sharing an unusual fraction of symbol names.", "kind": "method", "line": 274, "name": "_duplicate_links", "signature": "def _duplicate_links(communities, node_map, skip_pairs)"}, {"doc": "Infer weak links between otherwise disconnected communities.", "kind": "method", "line": 317, "name": "_shared_context_links", "signature": "def _shared_context_links(self, communities, existing, node_map, layers)"}, {"doc": "Describe shared language or layer between two communities.", "kind": "method", "line": 353, "name": "_shared_context", "signature": "def _shared_context(first, second, node_map, layers)"}, {"doc": "Serialize connections as pretty-printed JSON.", "kind": "method", "line": 386, "name": "_build_connections_json", "signature": "def _build_connections_json(self, connections)"}, {"doc": "Synthesize a one-paragraph definition for a community.", "kind": "method", "line": 390, "name": "_definition_for", "signature": "def _definition_for(self, community, node_map)"}, {"doc": "Return a markdown table row for a single file, or empty string.", "kind": "method", "line": 419, "name": "_file_row", "signature": "def _file_row(self, fid, node_map, layers)"}, {"doc": "List oversized communities grouped by directory within budget.", "kind": "method", "line": 433, "name": "_build_grouped_files", "signature": "def _build_grouped_files(self, members, node_map, layers, max_files)"}, {"doc": "Build the synthesis page for a single community.", "kind": "method", "line": 482, "name": "_build_community_page", "signature": "def _build_community_page(self, community, node_map, resolved, analysis, layers, findings, analysis_v2, connections)"}, {"doc": "Generate deterministic open questions for a community.", "kind": "method", "line": 635, "name": "_questions_for", "signature": "def _questions_for(self, community, node_map, member_set, analysis_v2)"}, {"doc": "Return node ids whose on-disk size exceeds the large-file threshold.", "kind": "method", "line": 673, "name": "_large_files", "signature": "def _large_files(self, nodes, project_root)"}, {"doc": "Build the wiki entry point with overview and navigation.", "kind": "method", "line": 686, "name": "_build_index", "signature": "def _build_index(self, nodes, resolved, analysis, layers, findings, analysis_v2, communities, pages, connections, project_name, project_root)"}, {"doc": "Synthesize the central preoccupations paragraph.", "kind": "method", "line": 798, "name": "_overview_paragraph", "signature": "def _overview_paragraph(self, nodes, analysis, layers, findings, analysis_v2, communities)"}, {"doc": "Synthesize the connective tissue paragraph.", "kind": "method", "line": 831, "name": "_connective_paragraph", "signature": "def _connective_paragraph(self, communities, connections)"}, {"doc": "Synthesize the open questions paragraph.", "kind": "method", "line": 852, "name": "_questions_paragraph", "signature": "def _questions_paragraph(self, analysis, findings, analysis_v2, coverage)"}, {"doc": "Build the starter question log with feedback loop instructions.", "kind": "method", "line": 868, "name": "_build_queries", "signature": "def _build_queries(self, analysis)"}, {"doc": "Build the honest audit report with confidence and limits.", "kind": "method", "line": 893, "name": "_build_report", "signature": "def _build_report(self, nodes, edges, resolved, analysis, layers, findings, analysis_v2, communities, project_name, project_root)"}, {"doc": "Estimate wiki read cost as characters divided by four.", "kind": "method", "line": 965, "name": "_estimate_tokens", "signature": "def _estimate_tokens(self, nodes, connections)"}, {"doc": "Write wiki file content with UTF-8 encoding.", "kind": "method", "line": 976, "name": "_write", "signature": "def _write(path, content)"}, {"kind": "method", "line": 360, "name": "dominant", "signature": "def dominant(ids, key)"}]}, {"doc": "Parser factory: maps file extensions to per-language LanguageParser classes.", "id": "readmenator/parsers/__init__.py", "kind": "module", "label": "__init__.py", "language": "py", "sha256": "8bbef7b526b8e00a", "symbol_count": 2, "symbols": [{"kind": "function", "line": 34, "name": "_init_parser_map", "signature": "def _init_parser_map()"}, {"doc": "Factory: return a parser instance for the given file extension.", "kind": "function", "line": 70, "name": "create_parser", "signature": "def create_parser(extension, filename, config)"}]}, {"doc": "Assembly parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_assembly.py", "kind": "module", "label": "_assembly.py", "language": "py", "sha256": "8302729865f9addb", "symbol_count": 2, "symbols": [{"doc": "Parser for assembly (.asm, .s, .S).\n\nExtracts labels at the start of a line (``label:``) as function\nsymbols. This is a best-effort heuristic; local labels and\ndirectives are not always distinguishable.", "kind": "class", "line": 11, "name": "AssemblyParser", "signature": "class AssemblyParser(LanguageParser)"}, {"kind": "method", "line": 19, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "LanguageParser base class with shared docstring and signature extraction.", "id": "readmenator/parsers/_base.py", "kind": "module", "label": "_base.py", "language": "py", "sha256": "864d8a7c8f75e81b", "symbol_count": 6, "symbols": [{"doc": "Base class for all language-specific parsers.\n\nSubclasses must implement ``_extract_specifics`` to populate\n``self.symbols`` and ``self.imports``. Common utility methods\n``_extract_docstring`` and ``_extract_signature`` are provided\nfor reuse across all parsers.", "kind": "class", "line": 12, "name": "LanguageParser", "signature": "class LanguageParser"}, {"doc": "Initialise the parser with a file path and application config.\n\nArgs:\n    filename: Relative or absolute path of the source file.\n    config: Application-wide configuration settings.", "kind": "method", "line": 21, "name": "__init__", "signature": "def __init__(self, filename, config)"}, {"doc": "Parse *content* and populate symbol/import lists.\n\nSplits the source into lines, then delegates to the subclass-\nspecific ``_extract_specifics`` logic.", "kind": "method", "line": 36, "name": "parse", "signature": "def parse(self, content)"}, {"doc": "Subclass hook for language-specific symbol extraction.", "kind": "method", "line": 45, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}, {"doc": "Walk backwards from *line_num* to collect preceding comments/docstrings.\n\nSupports ``//``, ``///``, ``//!``, ``#``, ``/* */``, and ``/** */``\ncomment styles. Limits lookback to ``DOCSTRING_LOOKBACK_LINES``\nfrom Config.", "kind": "method", "line": 49, "name": "_extract_docstring", "signature": "def _extract_docstring(self, line_num)"}, {"doc": "Extract a compact signature snippet starting at *match_start*.\n\nScans forward to the opening brace or a fallback length,\nthen truncates to 100 characters for display.", "kind": "method", "line": 91, "name": "_extract_signature", "signature": "def _extract_signature(self, content, match_start, pattern)"}]}, {"doc": "C and C++ parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_c.py", "kind": "module", "label": "_c.py", "language": "py", "sha256": "95bfbf6354399505", "symbol_count": 3, "symbols": [{"doc": "Return True when a prototype prefix carries a return type.", "kind": "function", "line": 18, "name": "_has_type_prefix", "signature": "def _has_type_prefix(prefix)"}, {"doc": "Parser for C, C++ (.c, .cpp, .cc, .cxx, .h, .hpp, .hxx).\n\nExtracts includes, structs, classes, functions, and preprocessor\nmacros using regex heuristics tuned to C-family syntax.", "kind": "class", "line": 30, "name": "CParser", "signature": "class CParser(LanguageParser)"}, {"doc": "Extract C-family symbols and imports from source content.\n\nCollects includes (quoted vs system), structs, classes, enums,\nunions, typedefs, functions (definitions and prototypes), extern\ndeclarations, globals, and macros.", "kind": "method", "line": 37, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "C# parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_csharp.py", "kind": "module", "label": "_csharp.py", "language": "py", "sha256": "72953e4fdd0d211b", "symbol_count": 2, "symbols": [{"doc": "Parser for C# (.cs).\n\nExtracts ``using`` directives, class/struct/interface/record\ndeclarations, and methods with access modifiers.", "kind": "class", "line": 11, "name": "CSharpParser", "signature": "class CSharpParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Dart parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_dart.py", "kind": "module", "label": "_dart.py", "language": "py", "sha256": "344399a064b052b5", "symbol_count": 2, "symbols": [{"doc": "Parser for Dart (.dart).\n\nExtracts import statements, class declarations (with extends),\nand top-level or method function declarations by return type.", "kind": "class", "line": 11, "name": "DartParser", "signature": "class DartParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Elixir parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_elixir.py", "kind": "module", "label": "_elixir.py", "language": "py", "sha256": "d799080e08bda638", "symbol_count": 2, "symbols": [{"doc": "Parser for Elixir (.ex, .exs).\n\nExtracts ``import``/``alias``/``require``/``use`` directives,\nmodule definitions, and named function definitions.", "kind": "class", "line": 11, "name": "ElixirParser", "signature": "class ElixirParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "GDScript parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_gdscript.py", "kind": "module", "label": "_gdscript.py", "language": "py", "sha256": "00f5443c25e7d991", "symbol_count": 2, "symbols": [{"doc": "Parser for Godot GDScript (.gd).\n\nExtracts ``extends`` / ``class_name`` directives and ``func``\nmethod declarations.", "kind": "class", "line": 11, "name": "GDScriptParser", "signature": "class GDScriptParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Go parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_go.py", "kind": "module", "label": "_go.py", "language": "py", "sha256": "526dff226f3d22fe", "symbol_count": 2, "symbols": [{"doc": "Parser for Go (.go).\n\nExtracts import blocks or single import statements, exported\nfunctions (including methods), and type definitions (struct/interface).", "kind": "class", "line": 11, "name": "GoParser", "signature": "class GoParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Java parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_java.py", "kind": "module", "label": "_java.py", "language": "py", "sha256": "62ed3036088612a4", "symbol_count": 2, "symbols": [{"doc": "Parser for Java (.java).\n\nExtracts import statements, class and interface declarations,\nand methods complete with access modifiers and type signatures.", "kind": "class", "line": 11, "name": "JavaParser", "signature": "class JavaParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "JavaScript and TypeScript parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_javascript.py", "kind": "module", "label": "_javascript.py", "language": "py", "sha256": "c27e7fa4a88f8585", "symbol_count": 2, "symbols": [{"doc": "Parser for JavaScript / TypeScript (.js, .ts, .jsx, .tsx).\n\nExtracts ES module imports, CommonJS ``require`` calls, function\ndeclarations, arrow-function variables, and class definitions\n(including inheritance).", "kind": "class", "line": 11, "name": "JavaScriptParser", "signature": "class JavaScriptParser(LanguageParser)"}, {"kind": "method", "line": 19, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Kotlin parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_kotlin.py", "kind": "module", "label": "_kotlin.py", "language": "py", "sha256": "87189fdd0f2978a1", "symbol_count": 2, "symbols": [{"doc": "Parser for Kotlin (.kt, .kts).\n\nExtracts ``import`` statements, class/object/interface/data class\ndeclarations, and function definitions.", "kind": "class", "line": 11, "name": "KotlinParser", "signature": "class KotlinParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Lua parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_lua.py", "kind": "module", "label": "_lua.py", "language": "py", "sha256": "16320b2be180ea64", "symbol_count": 2, "symbols": [{"doc": "Parser for Lua (.lua).\n\nExtracts ``require`` imports, function declarations (named and\ntable-based), and module returns.", "kind": "class", "line": 11, "name": "LuaParser", "signature": "class LuaParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Nim parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_nim.py", "kind": "module", "label": "_nim.py", "language": "py", "sha256": "1723010d3f717307", "symbol_count": 2, "symbols": [{"doc": "Parser for Nim (.nim).\n\nExtracts ``import`` statements, ``proc`` / ``func`` / ``method``\ndeclarations, and ``type`` definitions.", "kind": "class", "line": 11, "name": "NimParser", "signature": "class NimParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "PHP parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_php.py", "kind": "module", "label": "_php.py", "language": "py", "sha256": "7249bfb61e8ac879", "symbol_count": 2, "symbols": [{"doc": "Parser for PHP (.php).\n\nExtracts ``use/require/include`` (including ``_once`` variants),\nfunction declarations, and class declarations.", "kind": "class", "line": 11, "name": "PHPParser", "signature": "class PHPParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Python parser: native ast extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_python.py", "kind": "module", "label": "_python.py", "language": "py", "sha256": "bc64944e53564e7b", "symbol_count": 2, "symbols": [{"doc": "Parser for Python (.py) using the native ``ast`` module.\n\nExtracts imports, functions (including async), and class\ndefinitions with docstrings via ``ast.get_docstring``.", "kind": "class", "line": 12, "name": "PythonParser", "signature": "class PythonParser(LanguageParser)"}, {"kind": "method", "line": 19, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Ruby parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_ruby.py", "kind": "module", "label": "_ruby.py", "language": "py", "sha256": "132a544faf508487", "symbol_count": 2, "symbols": [{"doc": "Parser for Ruby (.rb).\n\nExtracts ``require`` / ``require_relative`` imports, class and\nmodule definitions with inheritance, and method definitions.", "kind": "class", "line": 11, "name": "RubyParser", "signature": "class RubyParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Rust parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_rust.py", "kind": "module", "label": "_rust.py", "language": "py", "sha256": "7b5d8a443719c780", "symbol_count": 2, "symbols": [{"doc": "Parser for Rust (.rs).\n\nExtracts ``use`` imports, public and private functions,\nstructs, traits, and enums.", "kind": "class", "line": 11, "name": "RustParser", "signature": "class RustParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Scala parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_scala.py", "kind": "module", "label": "_scala.py", "language": "py", "sha256": "a0adb5d08d1cf0ec", "symbol_count": 2, "symbols": [{"doc": "Parser for Scala (.scala).\n\nExtracts ``import`` statements, class/object/trait declarations,\nand method definitions.", "kind": "class", "line": 11, "name": "ScalaParser", "signature": "class ScalaParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Shell parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_shell.py", "kind": "module", "label": "_shell.py", "language": "py", "sha256": "49b92556abae2fd0", "symbol_count": 2, "symbols": [{"doc": "Parser for shell scripts (.sh, .bash, .zsh).\n\nExtracts function declarations in both POSIX (``name() {``)\nand ``function`` keyword syntax.", "kind": "class", "line": 11, "name": "ShellParser", "signature": "class ShellParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Swift parser: regex extraction of symbols, signatures, docstrings, and imports.", "id": "readmenator/parsers/_swift.py", "kind": "module", "label": "_swift.py", "language": "py", "sha256": "b089c1aff3df1e54", "symbol_count": 2, "symbols": [{"doc": "Parser for Swift (.swift).\n\nExtracts ``import`` statements, class/struct/enum/protocol\ndeclarations with inheritance, and function definitions.", "kind": "class", "line": 11, "name": "SwiftParser", "signature": "class SwiftParser(LanguageParser)"}, {"kind": "method", "line": 18, "name": "_extract_specifics", "signature": "def _extract_specifics(self, content)"}]}, {"doc": "Launcher shim that runs the readmenator CLI from a source checkout.", "id": "readmenator.py", "kind": "module", "label": "readmenator.py", "language": "py", "sha256": "beabccf3e6d231db", "symbol_count": 0, "symbols": []}, {"id": "readmenator_orchestrator.py", "kind": "module", "label": "readmenator_orchestrator.py", "language": "py", "sha256": "b231c08688e2e407", "symbol_count": 34, "symbols": [{"kind": "class", "line": 21, "name": "Config", "signature": "class Config"}, {"kind": "method", "line": 50, "name": "_validate_repo_name", "signature": "def _validate_repo_name(name)"}, {"kind": "method", "line": 56, "name": "_validate_branch_name", "signature": "def _validate_branch_name(name)"}, {"kind": "method", "line": 62, "name": "_safe_env", "signature": "def _safe_env()"}, {"kind": "class", "line": 77, "name": "GitHubClient", "signature": "class GitHubClient"}, {"kind": "class", "line": 191, "name": "RepositoryProcessor", "signature": "class RepositoryProcessor"}, {"kind": "class", "line": 341, "name": "Orchestrator", "signature": "class Orchestrator"}, {"kind": "class", "line": 396, "name": "TestOrchestrator", "signature": "class TestOrchestrator(TestCase)"}, {"kind": "method", "line": 438, "name": "parse_arguments", "signature": "def parse_arguments()"}, {"kind": "method", "line": 455, "name": "main", "signature": "def main()"}, {"kind": "method", "line": 78, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 83, "name": "_resolve_user", "signature": "def _resolve_user(self)"}, {"kind": "method", "line": 104, "name": "_setup_git_auth", "signature": "def _setup_git_auth(self)"}, {"kind": "method", "line": 118, "name": "list_repos", "signature": "def list_repos(self)"}, {"kind": "method", "line": 130, "name": "close_existing_prs", "signature": "def close_existing_prs(self, repo)"}, {"kind": "method", "line": 158, "name": "delete_remote_branch", "signature": "def delete_remote_branch(self, repo)"}, {"kind": "method", "line": 170, "name": "create_pr", "signature": "def create_pr(self, repo, default_branch, timestamp)"}, {"kind": "method", "line": 192, "name": "__init__", "signature": "def __init__(self, config, github_client)"}, {"kind": "method", "line": 196, "name": "process", "signature": "def process(self, repo)"}, {"kind": "method", "line": 225, "name": "_get_default_branch", "signature": "def _get_default_branch(self, repo)"}, {"kind": "method", "line": 241, "name": "_clone_repository", "signature": "def _clone_repository(self, repo)"}, {"kind": "method", "line": 257, "name": "_run_readmenator", "signature": "def _run_readmenator(self, repo_dir)"}, {"kind": "method", "line": 277, "name": "_copy_to_docs_dir", "signature": "def _copy_to_docs_dir(self, repo_dir, generated_file)"}, {"kind": "method", "line": 290, "name": "_commit_and_push", "signature": "def _commit_and_push(self, repo_dir, repo)"}, {"kind": "method", "line": 336, "name": "_cleanup_temp_dir", "signature": "def _cleanup_temp_dir(temp_dir)"}, {"kind": "method", "line": 342, "name": "__init__", "signature": "def __init__(self, config)"}, {"kind": "method", "line": 347, "name": "run", "signature": "def run(self, dry_run, only_repo)"}, {"kind": "method", "line": 397, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 401, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 404, "name": "test_config_immutability", "signature": "def test_config_immutability(self)"}, {"kind": "method", "line": 408, "name": "test_config_defaults", "signature": "def test_config_defaults(self)"}, {"kind": "method", "line": 415, "name": "test_skip_repos_logic", "signature": "def test_skip_repos_logic(self)"}, {"kind": "method", "line": 419, "name": "test_repo_name_validation", "signature": "def test_repo_name_validation(self)"}, {"kind": "method", "line": 429, "name": "test_branch_name_validation", "signature": "def test_branch_name_validation(self)"}]}, {"id": "tests/__init__.py", "kind": "module", "label": "__init__.py", "language": "py", "sha256": "f813c53b4d1cc74f", "symbol_count": 0, "symbols": []}, {"doc": "Contract tests for agent-facing output quality: budgets, purposes, freshness, noise.", "id": "tests/test_agent_friendliness.py", "kind": "module", "label": "test_agent_friendliness.py", "language": "py", "sha256": "b1fd187e1f2c3393", "symbol_count": 43, "symbols": [{"doc": "Build a Python file node for tests.", "kind": "function", "line": 21, "name": "_node", "signature": "def _node(node_id, doc, symbols)"}, {"doc": "Build an extracted edge for tests.", "kind": "function", "line": 29, "name": "_edge", "signature": "def _edge(source, target, relation)"}, {"doc": "Build a project large enough to force pagination of every document.", "kind": "function", "line": 34, "name": "_big_project", "signature": "def _big_project(files, symbols_per_file)"}, {"doc": "Every generated document respects the line cap, with nothing lost.", "kind": "class", "line": 55, "name": "TestAgentOutputBudget", "signature": "class TestAgentOutputBudget(TestCase)"}, {"doc": "Documents carry signal, not repetition.", "kind": "class", "line": 110, "name": "TestAgentOutputSignal", "signature": "class TestAgentOutputSignal(TestCase)"}, {"doc": "File purposes are one clean sentence with a symbol fallback.", "kind": "class", "line": 176, "name": "TestPurposeExtraction", "signature": "class TestPurposeExtraction(TestCase)"}, {"doc": "MANIFEST lets an agent decide staleness without reading anything else.", "kind": "class", "line": 199, "name": "TestManifestFreshness", "signature": "class TestManifestFreshness(TestCase)"}, {"doc": "Generated artifacts and naive heuristics never pollute the graph.", "kind": "class", "line": 244, "name": "TestNoiseReduction", "signature": "class TestNoiseReduction(TestCase)"}, {"doc": "The published site exposes an llms.txt entry point for agents.", "kind": "class", "line": 281, "name": "TestLlmsTxt", "signature": "class TestLlmsTxt(TestCase)"}, {"doc": "A shared hub imported by every file must not merge unrelated clusters.", "kind": "class", "line": 308, "name": "TestCommunityHubDamping", "signature": "class TestCommunityHubDamping(TestCase)"}, {"doc": "Docs freshness is verifiable from content, independent of commit timing.", "kind": "class", "line": 329, "name": "TestSourceFreshness", "signature": "class TestSourceFreshness(TestCase)"}, {"doc": "Tiny groups fold into neighbors and shared-directory labels stay distinct.", "kind": "class", "line": 363, "name": "TestCommunityShaping", "signature": "class TestCommunityShaping(TestCase)"}, {"doc": "The static site never keeps copies of docs that were renamed or removed.", "kind": "class", "line": 394, "name": "TestSiteDocsPruning", "signature": "class TestSiteDocsPruning(TestCase)"}, {"kind": "method", "line": 58, "name": "test_agent_output_pages_respect_line_cap_on_large_projects", "signature": "def test_agent_output_pages_respect_line_cap_on_large_projects(self)"}, {"kind": "method", "line": 71, "name": "test_agent_output_pagination_keeps_every_symbol_greppable", "signature": "def test_agent_output_pagination_keeps_every_symbol_greppable(self)"}, {"kind": "method", "line": 84, "name": "test_agent_output_pages_repeat_table_header_and_link_next", "signature": "def test_agent_output_pages_repeat_table_header_and_link_next(self)"}, {"kind": "method", "line": 96, "name": "test_agent_output_prunes_stale_pages", "signature": "def test_agent_output_prunes_stale_pages(self)"}, {"kind": "method", "line": 113, "name": "test_api_states_dependencies_once_per_file", "signature": "def test_api_states_dependencies_once_per_file(self)"}, {"kind": "method", "line": 122, "name": "test_api_skips_private_helpers_and_test_layer", "signature": "def test_api_skips_private_helpers_and_test_layer(self)"}, {"kind": "method", "line": 136, "name": "test_api_qualifies_methods_with_owner_class", "signature": "def test_api_qualifies_methods_with_owner_class(self)"}, {"kind": "method", "line": 144, "name": "test_architecture_external_excludes_internally_resolved_imports", "signature": "def test_architecture_external_excludes_internally_resolved_imports(self)"}, {"kind": "method", "line": 153, "name": "test_index_reports_used_by_count_and_escapes_pipes", "signature": "def test_index_reports_used_by_count_and_escapes_pipes(self)"}, {"kind": "method", "line": 161, "name": "test_gotchas_exclude_test_layer_and_report_blast_radius", "signature": "def test_gotchas_exclude_test_layer_and_report_blast_radius(self)"}, {"kind": "method", "line": 179, "name": "test_purpose_takes_first_sentence", "signature": "def test_purpose_takes_first_sentence(self)"}, {"kind": "method", "line": 182, "name": "test_purpose_skips_banners_and_spdx", "signature": "def test_purpose_skips_banners_and_spdx(self)"}, {"kind": "method", "line": 185, "name": "test_purpose_falls_back_to_primary_public_symbol", "signature": "def test_purpose_falls_back_to_primary_public_symbol(self)"}, {"kind": "method", "line": 192, "name": "test_purpose_truncates_on_word_boundary", "signature": "def test_purpose_truncates_on_word_boundary(self)"}, {"doc": "Create a minimal git directory layout pointing at a fixed commit.", "kind": "method", "line": 202, "name": "_git_repo", "signature": "def _git_repo(self, root, packed)"}, {"kind": "method", "line": 214, "name": "test_gitmeta_reads_loose_and_packed_refs", "signature": "def test_gitmeta_reads_loose_and_packed_refs(self)"}, {"kind": "method", "line": 220, "name": "test_gitmeta_outside_repository_is_empty", "signature": "def test_gitmeta_outside_repository_is_empty(self)"}, {"kind": "method", "line": 224, "name": "test_manifest_has_commit_relative_root_and_inventory", "signature": "def test_manifest_has_commit_relative_root_and_inventory(self)"}, {"kind": "method", "line": 247, "name": "test_scanner_skips_own_generated_outputs", "signature": "def test_scanner_skips_own_generated_outputs(self)"}, {"kind": "method", "line": 260, "name": "test_resolver_prefers_root_package_over_launcher_shim", "signature": "def test_resolver_prefers_root_package_over_launcher_shim(self)"}, {"kind": "method", "line": 264, "name": "test_layers_match_whole_words_not_substrings", "signature": "def test_layers_match_whole_words_not_substrings(self)"}, {"kind": "method", "line": 272, "name": "test_layers_test_framework_import_needs_test_path", "signature": "def test_layers_test_framework_import_needs_test_path(self)"}, {"kind": "method", "line": 284, "name": "test_llms_txt_lists_wiki_before_agent_docs", "signature": "def test_llms_txt_lists_wiki_before_agent_docs(self)"}, {"kind": "method", "line": 296, "name": "test_publish_writes_llms_txt", "signature": "def test_publish_writes_llms_txt(self)"}, {"kind": "method", "line": 311, "name": "test_communities_survive_a_shared_hub", "signature": "def test_communities_survive_a_shared_hub(self)"}, {"kind": "method", "line": 332, "name": "test_fingerprint_changes_with_content_not_with_order", "signature": "def test_fingerprint_changes_with_content_not_with_order(self)"}, {"kind": "method", "line": 343, "name": "test_check_freshness_detects_source_edits", "signature": "def test_check_freshness_detects_source_edits(self)"}, {"kind": "method", "line": 366, "name": "test_small_community_merges_into_best_connected_neighbor", "signature": "def test_small_community_merges_into_best_connected_neighbor(self)"}, {"kind": "method", "line": 380, "name": "test_shared_directory_labels_use_core_file", "signature": "def test_shared_directory_labels_use_core_file(self)"}, {"kind": "method", "line": 397, "name": "test_publish_assets_prunes_stale_markdown", "signature": "def test_publish_assets_prunes_stale_markdown(self)"}]}, {"doc": "Contract tests for AI agent file injection.  SDD + TDD + BDD: Each test validates a specific behavioral contract of the AgentInjector for injecting/deleting knowledge base references into AI agent instruction files.", "id": "tests/test_agent_injector.py", "kind": "module", "label": "test_agent_injector.py", "language": "py", "sha256": "aa95990d0f7c19ca", "symbol_count": 38, "symbols": [{"doc": "BDD: AgentInjector injection contract.", "kind": "class", "line": 19, "name": "TestAgentInjectorInjectBehavior", "signature": "class TestAgentInjectorInjectBehavior(TestCase)"}, {"doc": "BDD: AgentInjector removal contract.", "kind": "class", "line": 168, "name": "TestAgentInjectorRemoveBehavior", "signature": "class TestAgentInjectorRemoveBehavior(TestCase)"}, {"doc": "BDD: AgentInjector file detection contract.", "kind": "class", "line": 211, "name": "TestAgentInjectorFindFiles", "signature": "class TestAgentInjectorFindFiles(TestCase)"}, {"doc": "BDD: AgentInjector edge case contract.", "kind": "class", "line": 248, "name": "TestAgentInjectorEdgeCases", "signature": "class TestAgentInjectorEdgeCases(TestCase)"}, {"kind": "method", "line": 22, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 27, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 30, "name": "test_inject_into_agents_md_adds_kb_link", "signature": "def test_inject_into_agents_md_adds_kb_link(self)"}, {"kind": "method", "line": 39, "name": "test_inject_into_claude_md_adds_kb_link", "signature": "def test_inject_into_claude_md_adds_kb_link(self)"}, {"kind": "method", "line": 49, "name": "test_inject_into_cursorrules_adds_kb_link", "signature": "def test_inject_into_cursorrules_adds_kb_link(self)"}, {"kind": "method", "line": 57, "name": "test_inject_into_github_copilot_instructions", "signature": "def test_inject_into_github_copilot_instructions(self)"}, {"kind": "method", "line": 67, "name": "test_inject_replaces_old_injection_without_regen_command", "signature": "def test_inject_replaces_old_injection_without_regen_command(self)"}, {"kind": "method", "line": 82, "name": "test_inject_skips_when_already_up_to_date", "signature": "def test_inject_skips_when_already_up_to_date(self)"}, {"kind": "method", "line": 96, "name": "test_inject_into_cursor_rules_mdc_glob", "signature": "def test_inject_into_cursor_rules_mdc_glob(self)"}, {"kind": "method", "line": 106, "name": "test_inject_is_idempotent_does_not_duplicate", "signature": "def test_inject_is_idempotent_does_not_duplicate(self)"}, {"kind": "method", "line": 117, "name": "test_inject_no_agent_files_returns_zero", "signature": "def test_inject_no_agent_files_returns_zero(self)"}, {"kind": "method", "line": 121, "name": "test_inject_preserves_existing_content", "signature": "def test_inject_preserves_existing_content(self)"}, {"kind": "method", "line": 129, "name": "test_inject_multiple_agent_files", "signature": "def test_inject_multiple_agent_files(self)"}, {"kind": "method", "line": 136, "name": "test_inject_plain_text_format_for_yaml", "signature": "def test_inject_plain_text_format_for_yaml(self)"}, {"kind": "method", "line": 145, "name": "test_custom_kb_filename_works", "signature": "def test_custom_kb_filename_works(self)"}, {"kind": "method", "line": 153, "name": "test_injection_includes_regeneration_command", "signature": "def test_injection_includes_regeneration_command(self)"}, {"kind": "method", "line": 160, "name": "test_inject_does_not_execute_commands", "signature": "def test_inject_does_not_execute_commands(self)"}, {"kind": "method", "line": 171, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 176, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 179, "name": "test_remove_strips_injected_section", "signature": "def test_remove_strips_injected_section(self)"}, {"kind": "method", "line": 190, "name": "test_remove_without_injection_returns_zero", "signature": "def test_remove_without_injection_returns_zero(self)"}, {"kind": "method", "line": 196, "name": "test_remove_no_files_returns_zero", "signature": "def test_remove_no_files_returns_zero(self)"}, {"kind": "method", "line": 200, "name": "test_remove_preserves_original_content", "signature": "def test_remove_preserves_original_content(self)"}, {"kind": "method", "line": 214, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 218, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 221, "name": "test_finds_agents_md", "signature": "def test_finds_agents_md(self)"}, {"kind": "method", "line": 227, "name": "test_finds_all_listed_files", "signature": "def test_finds_all_listed_files(self)"}, {"kind": "method", "line": 234, "name": "test_finds_cursor_rules_glob", "signature": "def test_finds_cursor_rules_glob(self)"}, {"kind": "method", "line": 243, "name": "test_returns_empty_when_no_files", "signature": "def test_returns_empty_when_no_files(self)"}, {"kind": "method", "line": 251, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 256, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 259, "name": "test_inject_into_empty_file", "signature": "def test_inject_into_empty_file(self)"}, {"kind": "method", "line": 267, "name": "test_inject_respects_custom_agent_files_list", "signature": "def test_inject_respects_custom_agent_files_list(self)"}, {"kind": "method", "line": 275, "name": "test_inject_does_not_touch_unlisted_files", "signature": "def test_inject_does_not_touch_unlisted_files(self)"}]}, {"id": "tests/test_agent_output.py", "kind": "module", "label": "test_agent_output.py", "language": "py", "sha256": "02505a50e24794e4", "symbol_count": 45, "symbols": [{"kind": "function", "line": 19, "name": "_make_node", "signature": "def _make_node(node_id, symbols, doc, language)"}, {"kind": "function", "line": 30, "name": "_make_edge", "signature": "def _make_edge(source, target, relation)"}, {"kind": "function", "line": 34, "name": "_make_finding", "signature": "def _make_finding(file_path, line, severity, rule_id, description, snippet, cwe)"}, {"kind": "class", "line": 49, "name": "TestAgentOutputContract", "signature": "class TestAgentOutputContract(TestCase)"}, {"kind": "class", "line": 63, "name": "TestSubsystemInference", "signature": "class TestSubsystemInference(TestCase)"}, {"kind": "class", "line": 117, "name": "TestIndexGeneration", "signature": "class TestIndexGeneration(TestCase)"}, {"kind": "class", "line": 143, "name": "TestSecurityGeneration", "signature": "class TestSecurityGeneration(TestCase)"}, {"kind": "class", "line": 190, "name": "TestGotchasGeneration", "signature": "class TestGotchasGeneration(TestCase)"}, {"kind": "class", "line": 246, "name": "TestArchitectureGeneration", "signature": "class TestArchitectureGeneration(TestCase)"}, {"kind": "class", "line": 268, "name": "TestApiGeneration", "signature": "class TestApiGeneration(TestCase)"}, {"kind": "class", "line": 294, "name": "TestSubsystemFileGeneration", "signature": "class TestSubsystemFileGeneration(TestCase)"}, {"kind": "class", "line": 316, "name": "TestRecipesGeneration", "signature": "class TestRecipesGeneration(TestCase)"}, {"kind": "class", "line": 362, "name": "TestFullGenerate", "signature": "class TestFullGenerate(TestCase)"}, {"kind": "class", "line": 434, "name": "TestInjectionOutdatedDetection", "signature": "class TestInjectionOutdatedDetection(TestCase)"}, {"kind": "method", "line": 50, "name": "test_config_defaults", "signature": "def test_config_defaults(self)"}, {"kind": "method", "line": 56, "name": "test_config_immutable", "signature": "def test_config_immutable(self)"}, {"kind": "method", "line": 64, "name": "test_inferred_from_directories", "signature": "def test_inferred_from_directories(self)"}, {"kind": "method", "line": 80, "name": "test_flat_project_single_file", "signature": "def test_flat_project_single_file(self)"}, {"kind": "method", "line": 91, "name": "test_min_threshold_respected", "signature": "def test_min_threshold_respected(self)"}, {"kind": "method", "line": 103, "name": "test_misc_catches_unassigned", "signature": "def test_misc_catches_unassigned(self)"}, {"kind": "method", "line": 118, "name": "test_index_lists_all_files", "signature": "def test_index_lists_all_files(self)"}, {"kind": "method", "line": 133, "name": "test_index_table_format", "signature": "def test_index_table_format(self)"}, {"kind": "method", "line": 144, "name": "test_empty_findings", "signature": "def test_empty_findings(self)"}, {"kind": "method", "line": 150, "name": "test_findings_grouped_by_severity", "signature": "def test_findings_grouped_by_severity(self)"}, {"kind": "method", "line": 166, "name": "test_findings_include_fix_hint_and_scope", "signature": "def test_findings_include_fix_hint_and_scope(self)"}, {"kind": "method", "line": 181, "name": "test_no_json_wrapping", "signature": "def test_no_json_wrapping(self)"}, {"kind": "method", "line": 191, "name": "test_god_nodes_section", "signature": "def test_god_nodes_section(self)"}, {"kind": "method", "line": 207, "name": "test_cycles_section", "signature": "def test_cycles_section(self)"}, {"kind": "method", "line": 224, "name": "test_empty_gotchas", "signature": "def test_empty_gotchas(self)"}, {"kind": "method", "line": 230, "name": "test_cycle_loop_closed", "signature": "def test_cycle_loop_closed(self)"}, {"kind": "method", "line": 247, "name": "test_internal_dependencies", "signature": "def test_internal_dependencies(self)"}, {"kind": "method", "line": 258, "name": "test_external_imports", "signature": "def test_external_imports(self)"}, {"kind": "method", "line": 269, "name": "test_functions_listed", "signature": "def test_functions_listed(self)"}, {"kind": "method", "line": 283, "name": "test_no_json_in_api", "signature": "def test_no_json_in_api(self)"}, {"kind": "method", "line": 295, "name": "test_subsystem_files_written", "signature": "def test_subsystem_files_written(self)"}, {"kind": "method", "line": 317, "name": "test_recipes_directory", "signature": "def test_recipes_directory(self)"}, {"kind": "method", "line": 330, "name": "test_recipes_grounded_in_actual_findings", "signature": "def test_recipes_grounded_in_actual_findings(self)"}, {"kind": "method", "line": 363, "name": "test_generate_creates_all_files", "signature": "def test_generate_creates_all_files(self)"}, {"kind": "method", "line": 394, "name": "test_all_files_under_500_lines", "signature": "def test_all_files_under_500_lines(self)"}, {"kind": "method", "line": 409, "name": "test_no_json_in_any_output", "signature": "def test_no_json_in_any_output(self)"}, {"kind": "method", "line": 421, "name": "test_manifest_workflow_orients_with_ls", "signature": "def test_manifest_workflow_orients_with_ls(self)"}, {"kind": "method", "line": 435, "name": "test_agent_injector_detects_outdated", "signature": "def test_agent_injector_detects_outdated(self)"}, {"kind": "method", "line": 457, "name": "test_agent_injector_skips_identical", "signature": "def test_agent_injector_skips_identical(self)"}, {"kind": "method", "line": 473, "name": "test_readme_injector_detects_outdated", "signature": "def test_readme_injector_detects_outdated(self)"}, {"kind": "method", "line": 495, "name": "test_readme_injector_skips_identical", "signature": "def test_readme_injector_skips_identical(self)"}]}, {"doc": "Contract tests for the GraphAnalyzer.  Validates community detection, god node computation, surprising connection discovery, and suggested question generation.", "id": "tests/test_analyzer.py", "kind": "module", "label": "test_analyzer.py", "language": "py", "sha256": "0176c63295817db0", "symbol_count": 14, "symbols": [{"doc": "Contract: GraphAnalyzer provides graph intelligence.", "kind": "class", "line": 16, "name": "TestGraphAnalyzerContract", "signature": "class TestGraphAnalyzerContract(TestCase)"}, {"kind": "method", "line": 19, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 23, "name": "_make_node", "signature": "def _make_node(self, nid, label, lang)"}, {"kind": "method", "line": 26, "name": "_make_edge", "signature": "def _make_edge(self, src, tgt, rel)"}, {"kind": "method", "line": 29, "name": "test_analyze_empty_graph_returns_empty_result", "signature": "def test_analyze_empty_graph_returns_empty_result(self)"}, {"kind": "method", "line": 34, "name": "test_analyze_detects_communities_for_connected_graph", "signature": "def test_analyze_detects_communities_for_connected_graph(self)"}, {"kind": "method", "line": 48, "name": "test_analyze_computes_god_nodes", "signature": "def test_analyze_computes_god_nodes(self)"}, {"kind": "method", "line": 64, "name": "test_analyze_finds_surprising_connections", "signature": "def test_analyze_finds_surprising_connections(self)"}, {"kind": "method", "line": 81, "name": "test_analyze_generates_questions", "signature": "def test_analyze_generates_questions(self)"}, {"kind": "method", "line": 92, "name": "test_community_cohesion_is_between_zero_and_one", "signature": "def test_community_cohesion_is_between_zero_and_one(self)"}, {"kind": "method", "line": 107, "name": "test_isolated_nodes_do_not_form_communities", "signature": "def test_isolated_nodes_do_not_form_communities(self)"}, {"kind": "method", "line": 116, "name": "test_analyze_with_resolved_edges_counts_them", "signature": "def test_analyze_with_resolved_edges_counts_them(self)"}, {"kind": "method", "line": 130, "name": "test_analyze_is_repeatable", "signature": "def test_analyze_is_repeatable(self)"}, {"kind": "method", "line": 141, "name": "test_dominant_directory_prefers_specific_on_tie", "signature": "def test_dominant_directory_prefers_specific_on_tie(self)"}]}, {"doc": "Contract tests for the FileCache.  Validates SHA256 hashing, cache persistence, change detection, and stale entry pruning.", "id": "tests/test_cache.py", "kind": "module", "label": "test_cache.py", "language": "py", "sha256": "122bbfc37460eb38", "symbol_count": 22, "symbols": [{"doc": "Contract: FileCache provides SHA256-based incremental scan support.", "kind": "class", "line": 18, "name": "TestFileCacheContract", "signature": "class TestFileCacheContract(TestCase)"}, {"kind": "method", "line": 21, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 26, "name": "tearDown", "signature": "def tearDown(self)"}, {"kind": "method", "line": 30, "name": "_write", "signature": "def _write(self, rel_path, content)"}, {"kind": "method", "line": 36, "name": "test_compute_hash_returns_hex_string", "signature": "def test_compute_hash_returns_hex_string(self)"}, {"kind": "method", "line": 42, "name": "test_different_content_produces_different_hash", "signature": "def test_different_content_produces_different_hash(self)"}, {"kind": "method", "line": 49, "name": "test_same_content_produces_same_hash", "signature": "def test_same_content_produces_same_hash(self)"}, {"kind": "method", "line": 56, "name": "test_load_returns_empty_dict_when_no_cache", "signature": "def test_load_returns_empty_dict_when_no_cache(self)"}, {"kind": "method", "line": 60, "name": "test_save_and_load_roundtrip", "signature": "def test_save_and_load_roundtrip(self)"}, {"kind": "method", "line": 66, "name": "test_find_changed_detects_new_files", "signature": "def test_find_changed_detects_new_files(self)"}, {"kind": "method", "line": 71, "name": "test_find_changed_detects_modified_files", "signature": "def test_find_changed_detects_modified_files(self)"}, {"kind": "method", "line": 78, "name": "test_find_changed_skips_unchanged_files", "signature": "def test_find_changed_skips_unchanged_files(self)"}, {"kind": "method", "line": 85, "name": "test_prune_deleted_removes_ghost_entries", "signature": "def test_prune_deleted_removes_ghost_entries(self)"}, {"kind": "method", "line": 92, "name": "test_compute_hashes_batch", "signature": "def test_compute_hashes_batch(self)"}, {"kind": "method", "line": 100, "name": "test_nonexistent_file_returns_empty_hash", "signature": "def test_nonexistent_file_returns_empty_hash(self)"}, {"kind": "method", "line": 109, "name": "test_save_and_load_analysis_roundtrip", "signature": "def test_save_and_load_analysis_roundtrip(self)"}, {"kind": "method", "line": 116, "name": "test_load_missing_analysis_key_returns_none", "signature": "def test_load_missing_analysis_key_returns_none(self)"}, {"kind": "method", "line": 120, "name": "test_clear_analysis_specific_key", "signature": "def test_clear_analysis_specific_key(self)"}, {"kind": "method", "line": 127, "name": "test_clear_analysis_all_keys", "signature": "def test_clear_analysis_all_keys(self)"}, {"kind": "method", "line": 134, "name": "test_has_changed_since_last_analysis_returns_true_on_first_run", "signature": "def test_has_changed_since_last_analysis_returns_true_on_first_run(self)"}, {"kind": "method", "line": 139, "name": "test_has_changed_since_last_analysis_returns_false_when_no_changes", "signature": "def test_has_changed_since_last_analysis_returns_false_when_no_changes(self)"}, {"kind": "method", "line": 147, "name": "test_has_changed_since_last_analysis_returns_true_when_file_changed", "signature": "def test_has_changed_since_last_analysis_returns_true_when_file_changed(self)"}]}, {"id": "tests/test_config.py", "kind": "module", "label": "test_config.py", "language": "py", "sha256": "0123e0442447e271", "symbol_count": 6, "symbols": [{"kind": "class", "line": 7, "name": "TestConfigContract", "signature": "class TestConfigContract(TestCase)"}, {"kind": "method", "line": 8, "name": "test_config_is_immutable", "signature": "def test_config_is_immutable(self)"}, {"kind": "method", "line": 13, "name": "test_config_defaults_are_sane", "signature": "def test_config_defaults_are_sane(self)"}, {"kind": "method", "line": 24, "name": "test_ignore_dirs_are_comprehensive", "signature": "def test_ignore_dirs_are_comprehensive(self)"}, {"kind": "method", "line": 30, "name": "test_plural_map_covers_all_symbol_types", "signature": "def test_plural_map_covers_all_symbol_types(self)"}, {"kind": "method", "line": 41, "name": "test_supported_extensions_no_duplicates", "signature": "def test_supported_extensions_no_duplicates(self)"}]}, {"id": "tests/test_cpg.py", "kind": "module", "label": "test_cpg.py", "language": "py", "sha256": "f71374c5b5964fc8", "symbol_count": 11, "symbols": [{"doc": "Contract: CodePropertyGraph generates valid JSON-LD CPG output.", "kind": "class", "line": 11, "name": "TestCodePropertyGraphContract", "signature": "class TestCodePropertyGraphContract(TestCase)"}, {"kind": "method", "line": 14, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 18, "name": "_make_node", "signature": "def _make_node(self, nid, label, lang)"}, {"kind": "method", "line": 21, "name": "_make_sym", "signature": "def _make_sym(self, name, kind, line)"}, {"kind": "method", "line": 24, "name": "test_generate_returns_valid_json", "signature": "def test_generate_returns_valid_json(self)"}, {"kind": "method", "line": 33, "name": "test_generate_includes_node_data", "signature": "def test_generate_includes_node_data(self)"}, {"kind": "method", "line": 49, "name": "test_generate_includes_edges", "signature": "def test_generate_includes_edges(self)"}, {"kind": "method", "line": 61, "name": "test_generate_includes_metadata", "signature": "def test_generate_includes_metadata(self)"}, {"kind": "method", "line": 71, "name": "test_privacy_mode_strips_docs", "signature": "def test_privacy_mode_strips_docs(self)"}, {"kind": "method", "line": 89, "name": "test_sha256_hash_included", "signature": "def test_sha256_hash_included(self)"}, {"kind": "method", "line": 96, "name": "test_empty_graph_returns_valid_json", "signature": "def test_empty_graph_returns_valid_json(self)"}]}, {"doc": "Contract tests for the CursorRulesGenerator.  Validates base rule generation, layer constraint extraction, analysis constraint extraction, and violation rule formatting.", "id": "tests/test_cursorrules.py", "kind": "module", "label": "test_cursorrules.py", "language": "py", "sha256": "cc1c4a1ca3487d28", "symbol_count": 12, "symbols": [{"doc": "Contract: CursorRulesGenerator produces deterministic rulesets.", "kind": "class", "line": 18, "name": "TestCursorRulesGeneratorContract", "signature": "class TestCursorRulesGeneratorContract(TestCase)"}, {"kind": "method", "line": 21, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 25, "name": "test_generate_returns_string", "signature": "def test_generate_returns_string(self)"}, {"kind": "method", "line": 29, "name": "test_generate_contains_header", "signature": "def test_generate_contains_header(self)"}, {"kind": "method", "line": 33, "name": "test_generate_contains_base_rules", "signature": "def test_generate_contains_base_rules(self)"}, {"kind": "method", "line": 38, "name": "test_generate_includes_layer_constraints", "signature": "def test_generate_includes_layer_constraints(self)"}, {"kind": "method", "line": 49, "name": "test_generate_includes_god_nodes", "signature": "def test_generate_includes_god_nodes(self)"}, {"kind": "method", "line": 62, "name": "test_generate_includes_communities", "signature": "def test_generate_includes_communities(self)"}, {"kind": "method", "line": 82, "name": "test_generate_includes_violations", "signature": "def test_generate_includes_violations(self)"}, {"kind": "method", "line": 95, "name": "test_generate_limits_violations_to_ten", "signature": "def test_generate_limits_violations_to_ten(self)"}, {"kind": "method", "line": 103, "name": "test_generate_writes_file_when_project_root", "signature": "def test_generate_writes_file_when_project_root(self)"}, {"kind": "method", "line": 111, "name": "test_generate_idempotent", "signature": "def test_generate_idempotent(self)"}]}, {"id": "tests/test_dataflow.py", "kind": "module", "label": "test_dataflow.py", "language": "py", "sha256": "d62ea2d04f4a9db7", "symbol_count": 47, "symbols": [{"kind": "function", "line": 8, "name": "_node", "signature": "def _node(node_id, funcs)"}, {"kind": "function", "line": 17, "name": "_analyze", "signature": "def _analyze(body)"}, {"kind": "class", "line": 25, "name": "TestDataflowContract", "signature": "class TestDataflowContract(TestCase)"}, {"kind": "method", "line": 26, "name": "test_config_defaults", "signature": "def test_config_defaults(self)"}, {"kind": "method", "line": 31, "name": "test_config_immutable", "signature": "def test_config_immutable(self)"}, {"kind": "method", "line": 37, "name": "test_uninit_use_detected", "signature": "def test_uninit_use_detected(self)"}, {"kind": "method", "line": 46, "name": "test_initialized_use_clean", "signature": "def test_initialized_use_clean(self)"}, {"kind": "method", "line": 50, "name": "test_params_count_as_initialized", "signature": "def test_params_count_as_initialized(self)"}, {"kind": "method", "line": 58, "name": "test_scanf_addr_counts_as_init", "signature": "def test_scanf_addr_counts_as_init(self)"}, {"kind": "method", "line": 62, "name": "test_dead_store_detected", "signature": "def test_dead_store_detected(self)"}, {"kind": "method", "line": 67, "name": "test_read_store_clean", "signature": "def test_read_store_clean(self)"}, {"kind": "method", "line": 71, "name": "test_unchecked_alloc_detected", "signature": "def test_unchecked_alloc_detected(self)"}, {"kind": "method", "line": 78, "name": "test_checked_alloc_clean", "signature": "def test_checked_alloc_clean(self)"}, {"kind": "method", "line": 84, "name": "test_disabled_returns_empty", "signature": "def test_disabled_returns_empty(self)"}, {"kind": "method", "line": 91, "name": "test_missing_content_skipped", "signature": "def test_missing_content_skipped(self)"}, {"kind": "method", "line": 96, "name": "test_issue_cap_respected", "signature": "def test_issue_cap_respected(self)"}, {"kind": "method", "line": 105, "name": "test_plain_assignment_is_not_a_declaration", "signature": "def test_plain_assignment_is_not_a_declaration(self)"}, {"kind": "method", "line": 110, "name": "test_subscript_store_counts_as_init", "signature": "def test_subscript_store_counts_as_init(self)"}, {"kind": "method", "line": 116, "name": "test_asm_output_counts_as_init", "signature": "def test_asm_output_counts_as_init(self)"}, {"kind": "method", "line": 123, "name": "test_fd_lt_zero_counts_as_checked", "signature": "def test_fd_lt_zero_counts_as_checked(self)"}, {"kind": "method", "line": 129, "name": "test_map_failed_counts_as_checked", "signature": "def test_map_failed_counts_as_checked(self)"}, {"kind": "method", "line": 136, "name": "test_member_null_check_counts", "signature": "def test_member_null_check_counts(self)"}, {"kind": "method", "line": 144, "name": "test_loop_carried_var_not_dead", "signature": "def test_loop_carried_var_not_dead(self)"}, {"kind": "method", "line": 156, "name": "test_line_numbers_survive_subscript_stores", "signature": "def test_line_numbers_survive_subscript_stores(self)"}, {"kind": "method", "line": 167, "name": "test_member_store_not_local_assign", "signature": "def test_member_store_not_local_assign(self)"}, {"kind": "method", "line": 173, "name": "test_array_arg_to_filler_counts_as_init", "signature": "def test_array_arg_to_filler_counts_as_init(self)"}, {"kind": "method", "line": 181, "name": "test_array_arg_to_readonly_still_uninit", "signature": "def test_array_arg_to_readonly_still_uninit(self)"}, {"kind": "method", "line": 188, "name": "test_array_filled_in_decl_init_call", "signature": "def test_array_filled_in_decl_init_call(self)"}, {"kind": "method", "line": 196, "name": "test_static_never_uninit", "signature": "def test_static_never_uninit(self)"}, {"kind": "method", "line": 203, "name": "test_derived_pointer_not_dead", "signature": "def test_derived_pointer_not_dead(self)"}, {"kind": "method", "line": 216, "name": "test_sizeof_is_not_a_read", "signature": "def test_sizeof_is_not_a_read(self)"}, {"kind": "method", "line": 225, "name": "test_block_comment_malloc_ignored", "signature": "def test_block_comment_malloc_ignored(self)"}, {"kind": "method", "line": 234, "name": "test_address_alias_pointer_not_dead", "signature": "def test_address_alias_pointer_not_dead(self)"}, {"kind": "method", "line": 248, "name": "test_array_store_before_read_suppresses_uninit", "signature": "def test_array_store_before_read_suppresses_uninit(self)"}, {"kind": "method", "line": 256, "name": "test_same_line_use_not_dead", "signature": "def test_same_line_use_not_dead(self)"}, {"kind": "method", "line": 264, "name": "test_same_line_only_assign_is_dead", "signature": "def test_same_line_only_assign_is_dead(self)"}, {"kind": "method", "line": 272, "name": "test_alias_pointer_store_initializes_array", "signature": "def test_alias_pointer_store_initializes_array(self)"}, {"kind": "method", "line": 281, "name": "test_inline_alias_fill_suppresses_uninit", "signature": "def test_inline_alias_fill_suppresses_uninit(self)"}, {"kind": "method", "line": 290, "name": "test_function_pointer_call_counts_as_use", "signature": "def test_function_pointer_call_counts_as_use(self)"}, {"kind": "method", "line": 298, "name": "test_plain_call_is_not_a_local_use", "signature": "def test_plain_call_is_not_a_local_use(self)"}, {"kind": "method", "line": 305, "name": "test_local_struct_does_not_truncate_span", "signature": "def test_local_struct_does_not_truncate_span(self)"}, {"kind": "method", "line": 329, "name": "test_file_scope_symbol_still_bounds_span", "signature": "def test_file_scope_symbol_still_bounds_span(self)"}, {"kind": "method", "line": 344, "name": "test_url_string_does_not_truncate_line", "signature": "def test_url_string_does_not_truncate_line(self)"}, {"kind": "method", "line": 352, "name": "test_assert_macro_counts_as_null_check", "signature": "def test_assert_macro_counts_as_null_check(self)"}, {"kind": "method", "line": 360, "name": "test_multiline_call_assigns_array_arg", "signature": "def test_multiline_call_assigns_array_arg(self)"}, {"kind": "method", "line": 369, "name": "test_address_taken_suppresses_dead_store", "signature": "def test_address_taken_suppresses_dead_store(self)"}, {"kind": "method", "line": 377, "name": "test_member_store_initializes_base", "signature": "def test_member_store_initializes_base(self)"}]}, {"doc": "Contract tests for the DeadCodeStripper.  Validates dead code detection, in-degree computation, entry point exclusion, and recommendation classification.", "id": "tests/test_dead_code.py", "kind": "module", "label": "test_dead_code.py", "language": "py", "sha256": "4878048842697a87", "symbol_count": 15, "symbols": [{"doc": "Contract: DeadCodeStripper identifies orphaned symbols.", "kind": "class", "line": 16, "name": "TestDeadCodeStripperContract", "signature": "class TestDeadCodeStripperContract(TestCase)"}, {"kind": "method", "line": 19, "name": "setUp", "signature": "def setUp(self)"}, {"kind": "method", "line": 23, "name": "_make_symbol", "signature": "def _make_symbol(self, name, kind)"}, {"kind": "method", "line": 26, "name": "_make_node", "signature": "def _make_node(self, nid, symbols)"}, {"kind": "method", "line": 35, "name": "_make_edge", "signature": "def _make_edge(self, src, tgt)"}, {"kind": "method", "line": 38, "name": "test_identify_empty_graph_returns_empty", "signature": "def test_identify_empty_graph_returns_empty(self)"}, {"kind": "method", "line": 42, "name": "test_identify_finds_dead_symbol", "signature": "def test_identify_finds_dead_symbol(self)"}, {"kind": "method", "line": 53, "name": "test_identify_excludes_entry_points", "signature": "def test_identify_excludes_entry_points(self)"}, {"kind": "method", "line": 61, "name": "test_identify_excludes_app_entry_point", "signature": "def test_identify_excludes_app_entry_point(self)"}, {"kind": "method", "line": 69, "name": "test_identify_excludes_init_entry_point", "signature": "def test_identify_excludes_init_entry_point(self)"}, {"kind": "method", "line": 77, "name": "test_identify_recommends_review_for_classes", "signature": "def test_identify_recommends_review_for_classes(self)"}, {"kind": "method", "line": 85, "name": "test_identify_recommends_trash_for_functions", "signature": "def test_identify_recommends_trash_for_functions(self)"}, {"kind": "method", "line": 93, "name": "test_identify_recommends_trash_for_variables", "signature": "def test_identify_recommends_trash_for_variables(self)"}, {"kind": "method", "line": 101, "name": "test_all_symbols_imported_returns_empty", "signature": "def test_all_symbols_imported_returns_empty(self)"}, {"kind": "method", "line": 113, "name": "test_reports_sorted_by_file_path", "signature": "def test_reports_sorted_by_file_path(self)"}]}, {"doc": "Contract tests for interactive system maps.  Validates typed intermediate representations, deterministic validation receipts, before and after comparison, and self-contained HTML rendering for the five diagram kinds.", "id": "tests/test_diagrams.py", "kind": "module", "label": "test_diagrams.py", "language": "py", "sha256": "b7cdc257d034f07a", "symbol_count": 69, "symbols": [{"doc": "Contract: builder produces deterministic maps for all five kinds.", "kind": "class", "line": 30, "name": "TestSystemMapBuilderContract", "signature": "class TestSystemMapBuilderContract(TestCase)"}, {"doc": "Contract: validator returns deterministic receipts with rule codes.", "kind": "class", "line": 176, "name": "TestSystemMapValidatorContract", "signature": "class TestSystemMapValidatorContract(TestCase)"}, {"doc": "Contract: renderer emits standalone interactive HTML documents.", "kind": "class", "line": 237, "name": "TestInteractiveMapRendererContract", "signature": "class TestInteractiveMapRendererContract(TestCase)"}, {"doc": "Contract: publisher writes maps plus a gallery index as a static site.", "kind": "class", "line": 360, "name": "TestDocsSitePublisherContract", "signature": "class TestDocsSitePublisherContract(TestCase)"}, {"doc": "Contract: vis.js renderer emits CDN-powered physics documents.", "kind": "class", "line": 503, "name": "TestVisNetworkRendererContract", "signature": "class TestVisNetworkRendererContract(TestCase)"}, {"doc": "Contract: default exports are vis.js maps with gallery links.", "kind": "class", "line": 619, "name": "TestDiagramVariantsContract", "signature": "class TestDiagramVariantsContract(TestCase)"}, {"doc": "Initialise builder with default configuration.", "kind": "method", "line": 33, "name": "setUp", "signature": "def setUp(self)"}, {"doc": "Create a small deterministic project graph.", "kind": "method", "line": 38, "name": "_make_graph", "signature": "def _make_graph(self)"}, {"doc": "Builder exposes architecture, workflow, sequence, dataflow, lifecycle.", "kind": "method", "line": 52, "name": "test_builder_supports_five_kinds", "signature": "def test_builder_supports_five_kinds(self)"}, {"doc": "Build all returns one map per supported kind.", "kind": "method", "line": 59, "name": "test_builder_produces_all_kinds", "signature": "def test_builder_produces_all_kinds(self)"}, {"doc": "Two builds over identical input share coordinates and bytes.", "kind": "method", "line": 68, "name": "test_builder_is_deterministic", "signature": "def test_builder_is_deterministic(self)"}, {"doc": "Shuffled input edges yield identical ordered map relationships.", "kind": "method", "line": 80, "name": "test_builder_orders_links_deterministically", "signature": "def test_builder_orders_links_deterministically(self)"}, {"doc": "Large layered graphs validate for every diagram kind.", "kind": "method", "line": 101, "name": "test_builder_validates_large_graph_for_all_kinds", "signature": "def test_builder_validates_large_graph_for_all_kinds(self)"}, {"doc": "Built maps record shown scope and total input file count.", "kind": "method", "line": 119, "name": "test_builder_reports_total_scope", "signature": "def test_builder_reports_total_scope(self)"}, {"doc": "Map nodes carry symbol records, file docs, and language.", "kind": "method", "line": 126, "name": "test_builder_attaches_symbols_and_docs", "signature": "def test_builder_attaches_symbols_and_docs(self)"}, {"doc": "Symbol records respect the per-node configured cap.", "kind": "method", "line": 143, "name": "test_builder_truncates_symbols_per_node", "signature": "def test_builder_truncates_symbols_per_node(self)"}, {"doc": "Oversized graphs are truncated to the configured node limit.", "kind": "method", "line": 152, "name": "test_builder_truncates_to_configured_limit", "signature": "def test_builder_truncates_to_configured_limit(self)"}, {"doc": "Delta comparison reports added, removed, and rerouted facts.", "kind": "method", "line": 162, "name": "test_compare_reports_added_removed_rerouted", "signature": "def test_compare_reports_added_removed_rerouted(self)"}, {"doc": "Initialise validator with default configuration.", "kind": "method", "line": 179, "name": "setUp", "signature": "def setUp(self)"}, {"doc": "Create a minimal valid architecture map.", "kind": "method", "line": 184, "name": "_valid_map", "signature": "def _valid_map(self)"}, {"doc": "Valid maps pass with the full check list and zero errors.", "kind": "method", "line": 197, "name": "test_validator_passes_valid_map", "signature": "def test_validator_passes_valid_map(self)"}, {"doc": "Duplicate identifiers fail with rule D001.", "kind": "method", "line": 204, "name": "test_validator_rejects_duplicate_node_ids", "signature": "def test_validator_rejects_duplicate_node_ids(self)"}, {"doc": "Edges pointing at unknown nodes fail with rule D002.", "kind": "method", "line": 214, "name": "test_validator_rejects_dangling_edge", "signature": "def test_validator_rejects_dangling_edge(self)"}, {"doc": "Maps without nodes fail with rule D003.", "kind": "method", "line": 222, "name": "test_validator_rejects_empty_map", "signature": "def test_validator_rejects_empty_map(self)"}, {"doc": "Unknown diagram kinds fail with rule D000.", "kind": "method", "line": 228, "name": "test_validator_rejects_unknown_kind", "signature": "def test_validator_rejects_unknown_kind(self)"}, {"doc": "Initialise builder and renderer with default configuration.", "kind": "method", "line": 240, "name": "setUp", "signature": "def setUp(self)"}, {"doc": "Build a small map of the requested kind.", "kind": "method", "line": 246, "name": "_map", "signature": "def _map(self, kind)"}, {"doc": "Output is a complete HTML document with inline SVG.", "kind": "method", "line": 256, "name": "test_renderer_produces_standalone_document", "signature": "def test_renderer_produces_standalone_document(self)"}, {"doc": "Output performs no external fetches or CDN references.", "kind": "method", "line": 263, "name": "test_renderer_has_no_external_requests", "signature": "def test_renderer_has_no_external_requests(self)"}, {"doc": "Output includes search, passport, reach, route, lens, views, export.", "kind": "method", "line": 270, "name": "test_renderer_includes_interaction_controls", "signature": "def test_renderer_includes_interaction_controls(self)"}, {"doc": "Output documents shortcuts and hash deep link contracts.", "kind": "method", "line": 276, "name": "test_renderer_includes_keyboard_and_deep_links", "signature": "def test_renderer_includes_keyboard_and_deep_links(self)"}, {"doc": "Malicious labels are escaped and never break the document.", "kind": "method", "line": 285, "name": "test_renderer_escapes_malicious_labels", "signature": "def test_renderer_escapes_malicious_labels(self)"}, {"doc": "Embedded payload scripts parse as valid JSON arrays.", "kind": "method", "line": 298, "name": "test_renderer_embeds_valid_json_payloads", "signature": "def test_renderer_embeds_valid_json_payloads(self)"}, {"doc": "Every diagram kind renders a standalone document.", "kind": "method", "line": 307, "name": "test_renderer_covers_all_five_kinds", "signature": "def test_renderer_covers_all_five_kinds(self)"}, {"doc": "Maps with a home target expose a gallery back link.", "kind": "method", "line": 314, "name": "test_renderer_links_gallery_home_when_configured", "signature": "def test_renderer_links_gallery_home_when_configured(self)"}, {"doc": "Maps without a home target expose no gallery link.", "kind": "method", "line": 321, "name": "test_renderer_omits_gallery_home_by_default", "signature": "def test_renderer_omits_gallery_home_by_default(self)"}, {"doc": "Canvas background differs from node fill for readability.", "kind": "method", "line": 326, "name": "test_renderer_keeps_canvas_distinct_from_nodes", "signature": "def test_renderer_keeps_canvas_distinct_from_nodes(self)"}, {"doc": "Nodes are draggable with pointer capture plus a force pass.", "kind": "method", "line": 334, "name": "test_renderer_supports_drag_and_settle", "signature": "def test_renderer_supports_drag_and_settle(self)"}, {"doc": "Exports drop temporary focus, dim, and drag classes.", "kind": "method", "line": 342, "name": "test_renderer_sanitizes_viewer_state_on_export", "signature": "def test_renderer_sanitizes_viewer_state_on_export(self)"}, {"doc": "Every toolbar action carries a human-readable title.", "kind": "method", "line": 348, "name": "test_renderer_buttons_explain_their_purpose", "signature": "def test_renderer_buttons_explain_their_purpose(self)"}, {"doc": "Initialise builder and publisher with default configuration.", "kind": "method", "line": 363, "name": "setUp", "signature": "def setUp(self)"}, {"doc": "Build all five maps from a small deterministic graph.", "kind": "method", "line": 369, "name": "_maps", "signature": "def _maps(self)"}, {"doc": "Publish creates an index, five map files, and a nojekyll marker.", "kind": "method", "line": 379, "name": "test_publish_writes_index_plus_five_maps", "signature": "def test_publish_writes_index_plus_five_maps(self)"}, {"doc": "Gallery index links every published map with relative paths.", "kind": "method", "line": 390, "name": "test_publish_index_links_every_map", "signature": "def test_publish_index_links_every_map(self)"}, {"doc": "Index and maps perform no external fetches or CDN references.", "kind": "method", "line": 399, "name": "test_publish_output_has_no_external_requests", "signature": "def test_publish_output_has_no_external_requests(self)"}, {"doc": "Two publishes over identical input share index bytes.", "kind": "method", "line": 412, "name": "test_publish_is_deterministic", "signature": "def test_publish_is_deterministic(self)"}, {"doc": "Malicious project names are escaped in the gallery index.", "kind": "method", "line": 423, "name": "test_publish_escapes_malicious_project_name", "signature": "def test_publish_escapes_malicious_project_name(self)"}, {"doc": "Malicious statistics keys are escaped in the gallery index.", "kind": "method", "line": 432, "name": "test_publish_escapes_malicious_stat_keys", "signature": "def test_publish_escapes_malicious_stat_keys(self)"}, {"doc": "Maps failing validation are skipped while the index is written.", "kind": "method", "line": 443, "nam

Clone this wiki locally