code2llm 0.5.134__tar.gz → 0.5.136__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. {code2llm-0.5.134/code2llm.egg-info → code2llm-0.5.136}/PKG-INFO +11 -9
  2. {code2llm-0.5.134 → code2llm-0.5.136}/README.md +10 -8
  3. code2llm-0.5.136/VERSION +1 -0
  4. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/__init__.py +1 -1
  5. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/calls.py +5 -2
  6. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/classic.py +7 -4
  7. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/compact.py +5 -2
  8. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/flow_compact.py +15 -13
  9. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/flow_detailed.py +5 -2
  10. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/flow_full.py +5 -2
  11. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/utils.py +25 -4
  12. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid_flow_helpers.py +3 -2
  13. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/yaml_exporter.py +1 -0
  14. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/__init__.py +1 -1
  15. {code2llm-0.5.134 → code2llm-0.5.136/code2llm.egg-info}/PKG-INFO +11 -9
  16. {code2llm-0.5.134 → code2llm-0.5.136}/pyproject.toml +1 -1
  17. code2llm-0.5.134/VERSION +0 -1
  18. {code2llm-0.5.134 → code2llm-0.5.136}/LICENSE +0 -0
  19. {code2llm-0.5.134 → code2llm-0.5.136}/MANIFEST.in +0 -0
  20. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/__main__.py +0 -0
  21. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/__init__.py +0 -0
  22. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/call_graph.py +0 -0
  23. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/cfg.py +0 -0
  24. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/coupling.py +0 -0
  25. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/data_analysis.py +0 -0
  26. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/dfg.py +0 -0
  27. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/pipeline_classifier.py +0 -0
  28. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/pipeline_detector.py +0 -0
  29. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/pipeline_resolver.py +0 -0
  30. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/side_effects.py +0 -0
  31. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/smells.py +0 -0
  32. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/type_inference.py +0 -0
  33. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/utils/__init__.py +0 -0
  34. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/analysis/utils/ast_helpers.py +0 -0
  35. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/api.py +0 -0
  36. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli.py +0 -0
  37. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_analysis.py +0 -0
  38. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_commands.py +0 -0
  39. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/__init__.py +0 -0
  40. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/code2logic.py +0 -0
  41. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/formats.py +0 -0
  42. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/orchestrator.py +0 -0
  43. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/orchestrator_chunked.py +0 -0
  44. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/orchestrator_constants.py +0 -0
  45. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/orchestrator_handlers.py +0 -0
  46. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_exports/prompt.py +0 -0
  47. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/cli_parser.py +0 -0
  48. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/__init__.py +0 -0
  49. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/analyzer.py +0 -0
  50. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/ast_registry.py +0 -0
  51. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/config.py +0 -0
  52. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/export_pipeline.py +0 -0
  53. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/file_analyzer.py +0 -0
  54. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/file_cache.py +0 -0
  55. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/file_filter.py +0 -0
  56. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/gitignore.py +0 -0
  57. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/incremental.py +0 -0
  58. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/__init__.py +0 -0
  59. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/base.py +0 -0
  60. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/cpp.py +0 -0
  61. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/csharp.py +0 -0
  62. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/generic.py +0 -0
  63. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/go_lang.py +0 -0
  64. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/java.py +0 -0
  65. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/php.py +0 -0
  66. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/ruby.py +0 -0
  67. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/rust.py +0 -0
  68. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/ts_extractors.py +0 -0
  69. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/ts_parser.py +0 -0
  70. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/lang/typescript.py +0 -0
  71. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/large_repo.py +0 -0
  72. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/models.py +0 -0
  73. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/persistent_cache.py +0 -0
  74. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/refactoring.py +0 -0
  75. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/repo_files.py +0 -0
  76. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/__init__.py +0 -0
  77. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/cache.py +0 -0
  78. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/incremental.py +0 -0
  79. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/prioritizer.py +0 -0
  80. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/scanner.py +0 -0
  81. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming/strategies.py +0 -0
  82. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/streaming_analyzer.py +0 -0
  83. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/core/toon_size_manager.py +0 -0
  84. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/__init__.py +0 -0
  85. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/article_view.py +0 -0
  86. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/base.py +0 -0
  87. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/context_exporter.py +0 -0
  88. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/context_view.py +0 -0
  89. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/dashboard_data.py +0 -0
  90. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/dashboard_renderer.py +0 -0
  91. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/__init__.py +0 -0
  92. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/computation.py +0 -0
  93. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/constants.py +0 -0
  94. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/exclusion.py +0 -0
  95. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/render.py +0 -0
  96. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution/yaml_export.py +0 -0
  97. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/evolution_exporter.py +0 -0
  98. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/flow_constants.py +0 -0
  99. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/flow_exporter.py +0 -0
  100. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/flow_renderer.py +0 -0
  101. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/html_dashboard.py +0 -0
  102. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/index_generator/__init__.py +0 -0
  103. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/index_generator/renderer.py +0 -0
  104. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/index_generator/scanner.py +0 -0
  105. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/index_generator.py +0 -0
  106. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/json_exporter.py +0 -0
  107. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/llm_exporter.py +0 -0
  108. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/__init__.py +0 -0
  109. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/alerts.py +0 -0
  110. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/details.py +0 -0
  111. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/header.py +0 -0
  112. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/module_list.py +0 -0
  113. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/utils.py +0 -0
  114. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map/yaml_export.py +0 -0
  115. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/map_exporter.py +0 -0
  116. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid/__init__.py +0 -0
  117. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/mermaid_exporter.py +0 -0
  118. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/__init__.py +0 -0
  119. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/constants.py +0 -0
  120. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/core.py +0 -0
  121. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/evolution.py +0 -0
  122. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/health.py +0 -0
  123. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/hotspots.py +0 -0
  124. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml/modules.py +0 -0
  125. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/project_yaml_exporter.py +0 -0
  126. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme/__init__.py +0 -0
  127. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme/content.py +0 -0
  128. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme/files.py +0 -0
  129. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme/insights.py +0 -0
  130. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme/sections.py +0 -0
  131. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/readme_exporter.py +0 -0
  132. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/report_generators.py +0 -0
  133. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/__init__.py +0 -0
  134. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/helpers.py +0 -0
  135. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/metrics.py +0 -0
  136. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/metrics_core.py +0 -0
  137. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/metrics_duplicates.py +0 -0
  138. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/metrics_health.py +0 -0
  139. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/module_detail.py +0 -0
  140. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon/renderer.py +0 -0
  141. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon.py +0 -0
  142. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/toon_view.py +0 -0
  143. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/exporters/validate_project.py +0 -0
  144. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/__init__.py +0 -0
  145. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/_utils.py +0 -0
  146. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/__init__.py +0 -0
  147. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/analysis.py +0 -0
  148. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/cli.py +0 -0
  149. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/generator.py +0 -0
  150. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/nodes.py +0 -0
  151. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/parsing.py +0 -0
  152. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow/utils.py +0 -0
  153. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_flow.py +0 -0
  154. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/llm_task.py +0 -0
  155. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/mermaid/__init__.py +0 -0
  156. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/mermaid/fix.py +0 -0
  157. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/mermaid/png.py +0 -0
  158. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/mermaid/validation.py +0 -0
  159. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/generators/mermaid.py +0 -0
  160. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/config.py +0 -0
  161. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/entity_resolution.py +0 -0
  162. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/intent_matching.py +0 -0
  163. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/normalization.py +0 -0
  164. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/nlp/pipeline.py +0 -0
  165. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/parsers/toon_parser.py +0 -0
  166. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/patterns/__init__.py +0 -0
  167. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/patterns/detector.py +0 -0
  168. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/refactor/__init__.py +0 -0
  169. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm/refactor/prompt_engine.py +0 -0
  170. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm.egg-info/SOURCES.txt +0 -0
  171. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm.egg-info/dependency_links.txt +0 -0
  172. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm.egg-info/entry_points.txt +0 -0
  173. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm.egg-info/requires.txt +0 -0
  174. {code2llm-0.5.134 → code2llm-0.5.136}/code2llm.egg-info/top_level.txt +0 -0
  175. {code2llm-0.5.134 → code2llm-0.5.136}/setup.cfg +0 -0
  176. {code2llm-0.5.134 → code2llm-0.5.136}/setup.py +0 -0
  177. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_advanced_analysis.py +0 -0
  178. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_analyzer.py +0 -0
  179. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_calls_toon_export.py +0 -0
  180. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_deep_analysis.py +0 -0
  181. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_edge_cases.py +0 -0
  182. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_flow_exporter.py +0 -0
  183. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_format_quality.py +0 -0
  184. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_multilanguage_e2e.py +0 -0
  185. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_nlp_pipeline.py +0 -0
  186. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_nonpython_cc_calls.py +0 -0
  187. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_persistent_cache.py +0 -0
  188. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_pipeline_detector.py +0 -0
  189. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_project_toon_export.py +0 -0
  190. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_prompt_engine.py +0 -0
  191. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_prompt_txt.py +0 -0
  192. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_refactoring_engine.py +0 -0
  193. {code2llm-0.5.134 → code2llm-0.5.136}/tests/test_toon_v2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2llm
3
- Version: 0.5.134
3
+ Version: 0.5.136
4
4
  Summary: High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries
5
5
  Home-page: https://github.com/wronai/stts
6
6
  Author: STTS Project
@@ -67,16 +67,18 @@ Dynamic: requires-python
67
67
 
68
68
  ## AI Cost Tracking
69
69
 
70
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.134-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$153.46-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-64.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
70
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.136-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-65.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
72
72
 
73
- - 🤖 **LLM usage:** $153.4641 (195 commits)
74
- - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
73
+ - 🤖 **LLM usage:** $7.5000 (188 commits)
74
+ - 👤 **Human dev:** ~$6526 (65.3h @ $100/h, 30min dedup)
75
75
 
76
76
  Generated on 2026-04-20 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
77
77
 
78
78
  ---
79
79
 
80
+
81
+
80
82
  This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
81
83
 
82
84
  ## 📁 Generated Files Overview
@@ -404,10 +406,10 @@ code2llm ./ -f yaml --separate-orphans
404
406
  ---
405
407
 
406
408
  **Generated by**: `code2llm ./ -f all --readme`
407
- **Analysis Date**: 2026-04-19
408
- **Total Functions**: 1115
409
- **Total Classes**: 121
410
- **Modules**: 152
409
+ **Analysis Date**: 2026-04-20
410
+ **Total Functions**: 2124
411
+ **Total Classes**: 241
412
+ **Modules**: 359
411
413
 
412
414
  For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
413
415
 
@@ -3,16 +3,18 @@
3
3
 
4
4
  ## AI Cost Tracking
5
5
 
6
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.134-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$153.46-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-64.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
6
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.136-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-65.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $153.4641 (195 commits)
10
- - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (188 commits)
10
+ - 👤 **Human dev:** ~$6526 (65.3h @ $100/h, 30min dedup)
11
11
 
12
12
  Generated on 2026-04-20 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
13
13
 
14
14
  ---
15
15
 
16
+
17
+
16
18
  This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
17
19
 
18
20
  ## 📁 Generated Files Overview
@@ -340,10 +342,10 @@ code2llm ./ -f yaml --separate-orphans
340
342
  ---
341
343
 
342
344
  **Generated by**: `code2llm ./ -f all --readme`
343
- **Analysis Date**: 2026-04-19
344
- **Total Functions**: 1115
345
- **Total Classes**: 121
346
- **Modules**: 152
345
+ **Analysis Date**: 2026-04-20
346
+ **Total Functions**: 2124
347
+ **Total Classes**: 241
348
+ **Modules**: 359
347
349
 
348
350
  For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
349
351
 
@@ -0,0 +1 @@
1
+ 0.5.136
@@ -8,7 +8,7 @@ Includes NLP Processing Pipeline for query normalization, intent matching,
8
8
  and entity resolution with multilingual support.
9
9
  """
10
10
 
11
- __version__ = "0.5.134"
11
+ __version__ = "0.5.136"
12
12
  __author__ = "STTS Project"
13
13
 
14
14
  # Core analysis components (lightweight, always needed)
@@ -5,19 +5,22 @@ from pathlib import Path
5
5
 
6
6
  from code2llm.core.models import AnalysisResult
7
7
 
8
- from .utils import readable_id, safe_module, resolve_callee, write_file
8
+ from .utils import readable_id, safe_module, resolve_callee, write_file, build_name_index
9
9
 
10
10
 
11
11
  def export_calls(result: AnalysisResult, output_path: str) -> None:
12
12
  """Export simplified call graph — only connected nodes."""
13
13
  lines = ["flowchart LR"]
14
14
 
15
+ # Build name index for O(1) callee resolution
16
+ name_index = build_name_index(result.functions)
17
+
15
18
  # Collect connected nodes first
16
19
  connected: Set[str] = set()
17
20
  edges: List[Tuple[str, str]] = []
18
21
  for func_name, fi in result.functions.items():
19
22
  for callee in fi.calls[:10]:
20
- resolved = resolve_callee(callee, result.functions)
23
+ resolved = resolve_callee(callee, result.functions, name_index)
21
24
  if resolved and resolved != func_name:
22
25
  connected.add(func_name)
23
26
  connected.add(resolved)
@@ -5,18 +5,21 @@ from pathlib import Path
5
5
 
6
6
  from code2llm.core.models import AnalysisResult
7
7
 
8
- from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc
8
+ from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc, build_name_index
9
9
 
10
10
 
11
11
  def export_classic(result: AnalysisResult, output_path: str) -> Optional[Path]:
12
12
  """Export full flow diagram with CC-based node shapes and styling."""
13
13
  lines = ["flowchart TD"]
14
14
 
15
+ # Build name index for O(1) callee resolution
16
+ name_index = build_name_index(result.functions)
17
+
15
18
  # Subgraphs per module
16
19
  _render_subgraphs(result, lines)
17
20
 
18
21
  # Edges — all cross-function calls
19
- _render_edges(result, lines, limit=600)
22
+ _render_edges(result, lines, name_index, limit=600)
20
23
 
21
24
  # CC-based styling
22
25
  _render_cc_styles(result, lines)
@@ -48,13 +51,13 @@ def _render_subgraphs(result: AnalysisResult, lines: List[str]) -> None:
48
51
  lines.append(" end")
49
52
 
50
53
 
51
- def _render_edges(result: AnalysisResult, lines: List[str], limit: int = 600) -> None:
54
+ def _render_edges(result: AnalysisResult, lines: List[str], name_index: Dict[str, List[str]], limit: int = 600) -> None:
52
55
  """Render cross-function call edges up to limit."""
53
56
  seen_edges: Set[Tuple[str, str]] = set()
54
57
  for func_name, fi in result.functions.items():
55
58
  src = readable_id(func_name)
56
59
  for callee in fi.calls[:15]:
57
- resolved = resolve_callee(callee, result.functions)
60
+ resolved = resolve_callee(callee, result.functions, name_index)
58
61
  if resolved and resolved != func_name:
59
62
  dst = readable_id(resolved)
60
63
  edge = (src, dst)
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
 
7
7
  from code2llm.core.models import AnalysisResult
8
8
 
9
- from .utils import safe_module, resolve_callee, write_file
9
+ from .utils import safe_module, resolve_callee, write_file, build_name_index
10
10
 
11
11
 
12
12
  def export_compact(result: AnalysisResult, output_path: str) -> None:
@@ -14,6 +14,9 @@ def export_compact(result: AnalysisResult, output_path: str) -> None:
14
14
  lines = ["flowchart TD"]
15
15
 
16
16
  from .utils import module_of
17
+ # Build name index for O(1) callee resolution
18
+ name_index = build_name_index(result.functions)
19
+
17
20
  # Compute module stats
18
21
  mod_funcs: Dict[str, int] = defaultdict(int)
19
22
  mod_lines: Dict[str, int] = defaultdict(int)
@@ -27,7 +30,7 @@ def export_compact(result: AnalysisResult, output_path: str) -> None:
27
30
  for func_name, fi in result.functions.items():
28
31
  src_mod = module_of(func_name)
29
32
  for callee in fi.calls:
30
- resolved = resolve_callee(callee, result.functions)
33
+ resolved = resolve_callee(callee, result.functions, name_index)
31
34
  if resolved:
32
35
  dst_mod = module_of(resolved)
33
36
  if dst_mod != src_mod:
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
 
7
7
  from code2llm.core.models import AnalysisResult
8
8
 
9
- from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc
9
+ from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc, build_name_index
10
10
 
11
11
 
12
12
  # Default skip patterns for noise reduction
@@ -43,30 +43,30 @@ def is_entry_point(func_name: str, fi, result: AnalysisResult) -> bool:
43
43
  return False
44
44
 
45
45
 
46
- def build_callers_graph(result: AnalysisResult) -> Dict[str, Set[str]]:
46
+ def build_callers_graph(result: AnalysisResult, name_index: Dict[str, List[str]]) -> Dict[str, Set[str]]:
47
47
  """Build reverse graph: map each function to its callers."""
48
48
  callers: Dict[str, Set[str]] = defaultdict(set)
49
49
  for func_name, fi in result.functions.items():
50
50
  for callee in fi.calls:
51
- resolved = resolve_callee(callee, result.functions)
51
+ resolved = resolve_callee(callee, result.functions, name_index)
52
52
  if resolved:
53
53
  callers[resolved].add(func_name)
54
54
  return callers
55
55
 
56
56
 
57
- def find_leaves(result: AnalysisResult) -> Set[str]:
57
+ def find_leaves(result: AnalysisResult, name_index: Dict[str, List[str]]) -> Set[str]:
58
58
  """Find leaf nodes (functions that don't call other project functions)."""
59
59
  leaves = set()
60
60
  for func_name, fi in result.functions.items():
61
61
  has_internal_call = any(
62
- resolve_callee(c, result.functions) for c in fi.calls
62
+ resolve_callee(c, result.functions, name_index) for c in fi.calls
63
63
  )
64
64
  if not has_internal_call:
65
65
  leaves.add(func_name)
66
66
  return leaves
67
67
 
68
68
 
69
- def _longest_path_dfs(result: AnalysisResult, start: str, visited: Set[str]) -> List[str]:
69
+ def _longest_path_dfs(result: AnalysisResult, start: str, visited: Set[str], name_index: Dict[str, List[str]]) -> List[str]:
70
70
  """DFS to find longest path from start node."""
71
71
  if start in visited:
72
72
  return []
@@ -77,21 +77,21 @@ def _longest_path_dfs(result: AnalysisResult, start: str, visited: Set[str]) ->
77
77
 
78
78
  longest: List[str] = []
79
79
  for callee in fi.calls:
80
- resolved = resolve_callee(callee, result.functions)
80
+ resolved = resolve_callee(callee, result.functions, name_index)
81
81
  if resolved and resolved not in visited:
82
- path = _longest_path_dfs(result, resolved, visited)
82
+ path = _longest_path_dfs(result, resolved, visited, name_index)
83
83
  if len(path) > len(longest):
84
84
  longest = path
85
85
 
86
86
  return [start] + longest
87
87
 
88
88
 
89
- def _select_longest_path(result: AnalysisResult, entry_points: List[str]) -> List[str]:
89
+ def _select_longest_path(result: AnalysisResult, entry_points: List[str], name_index: Dict[str, List[str]]) -> List[str]:
90
90
  """Select the longest path from all entry points."""
91
91
  max_path: List[str] = []
92
92
  for ep in entry_points:
93
93
  if ep in result.functions:
94
- path = _longest_path_dfs(result, ep, set())
94
+ path = _longest_path_dfs(result, ep, set(), name_index)
95
95
  if len(path) > len(max_path):
96
96
  max_path = path
97
97
  return max_path
@@ -101,11 +101,13 @@ def find_critical_path(result: AnalysisResult, entry_points: List[str]) -> Set[s
101
101
  """Find the longest path from entry points (critical path)."""
102
102
  if not entry_points:
103
103
  return set()
104
+ # Build name index for O(1) resolution
105
+ name_index = build_name_index(result.functions)
104
106
  # Build data structures
105
- build_callers_graph(result)
106
- find_leaves(result)
107
+ build_callers_graph(result, name_index)
108
+ find_leaves(result, name_index)
107
109
  # Find longest path from each entry point
108
- max_path = _select_longest_path(result, entry_points)
110
+ max_path = _select_longest_path(result, entry_points, name_index)
109
111
  return set(max_path)
110
112
 
111
113
 
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
 
5
5
  from code2llm.core.models import AnalysisResult
6
6
 
7
- from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc
7
+ from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc, build_name_index
8
8
  from ..mermaid_flow_helpers import (
9
9
  _entry_points,
10
10
  _filtered_functions,
@@ -25,6 +25,9 @@ def export_flow_detailed(result: AnalysisResult, output_path: str,
25
25
  from .utils import module_of
26
26
 
27
27
  lines = ["flowchart TD"]
28
+
29
+ # Build name index for O(1) callee resolution
30
+ name_index = build_name_index(result.functions)
28
31
  lines.append("")
29
32
  lines.append(" %% Styling definitions")
30
33
  lines.append(" classDef highCC fill:#ff6b6b,stroke:#c92a2a,color:#fff")
@@ -50,7 +53,7 @@ def export_flow_detailed(result: AnalysisResult, output_path: str,
50
53
  sort_funcs=True,
51
54
  max_funcs=40,
52
55
  )
53
- _render_flow_edges(lines, filtered_funcs, readable_id, resolve_callee, calls_per_function=10, limit=200)
56
+ _render_flow_edges(lines, filtered_funcs, readable_id, resolve_callee, calls_per_function=10, limit=200, name_index=name_index)
54
57
  _render_flow_styles(
55
58
  lines,
56
59
  filtered_funcs,
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
 
5
5
  from code2llm.core.models import AnalysisResult
6
6
 
7
- from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc
7
+ from .utils import readable_id, safe_module, resolve_callee, write_file, get_cc, build_name_index
8
8
  from ..mermaid_flow_helpers import (
9
9
  _entry_points,
10
10
  _filtered_functions,
@@ -25,6 +25,9 @@ def export_flow_full(result: AnalysisResult, output_path: str,
25
25
  from .utils import module_of
26
26
 
27
27
  lines = ["flowchart TD"]
28
+
29
+ # Build name index for O(1) callee resolution
30
+ name_index = build_name_index(result.functions)
28
31
  lines.append("")
29
32
  lines.append(" %% Styling definitions")
30
33
  lines.append(" classDef highCC fill:#ff6b6b,stroke:#c92a2a,color:#fff")
@@ -50,7 +53,7 @@ def export_flow_full(result: AnalysisResult, output_path: str,
50
53
  sort_funcs=False,
51
54
  max_funcs=None,
52
55
  )
53
- _render_flow_edges(lines, filtered_funcs, readable_id, resolve_callee, calls_per_function=15, limit=None)
56
+ _render_flow_edges(lines, filtered_funcs, readable_id, resolve_callee, calls_per_function=15, limit=None, name_index=name_index)
54
57
  _render_flow_styles(
55
58
  lines,
56
59
  filtered_funcs,
@@ -1,8 +1,9 @@
1
1
  """Mermaid exporter utilities — identifiers, module extraction, file writing."""
2
2
 
3
3
  import re
4
+ from collections import defaultdict
4
5
  from pathlib import Path
5
- from typing import Optional
6
+ from typing import Dict, List, Optional
6
7
 
7
8
  from code2llm.core.models import FunctionInfo
8
9
 
@@ -42,11 +43,30 @@ def module_of(func_name: str) -> str:
42
43
  return parts[0] if parts else 'unknown'
43
44
 
44
45
 
45
- def resolve_callee(callee: str, funcs: dict) -> Optional[str]:
46
- """Resolve callee to a known qualified name."""
46
+ def build_name_index(funcs: dict) -> Dict[str, List[str]]:
47
+ """Build index mapping simple names to qualified names for O(1) lookup."""
48
+ index: Dict[str, List[str]] = defaultdict(list)
49
+ for qn in funcs:
50
+ simple_name = qn.split('.')[-1]
51
+ index[simple_name].append(qn)
52
+ return index
53
+
54
+
55
+ def resolve_callee(callee: str, funcs: dict, name_index: Optional[Dict[str, List[str]]] = None) -> Optional[str]:
56
+ """Resolve callee to a known qualified name.
57
+
58
+ Args:
59
+ callee: The callee name to resolve
60
+ funcs: Dictionary of all functions
61
+ name_index: Optional pre-built index from build_name_index() for O(1) lookup
62
+ """
47
63
  if callee in funcs:
48
64
  return callee
49
- candidates = [qn for qn in funcs if qn.endswith(f".{callee}")]
65
+ if name_index is not None:
66
+ candidates = name_index.get(callee, [])
67
+ else:
68
+ # Fallback to slow path if index not provided
69
+ candidates = [qn for qn in funcs if qn.endswith(f".{callee}")]
50
70
  if len(candidates) == 1:
51
71
  return candidates[0]
52
72
  return None
@@ -72,6 +92,7 @@ __all__ = [
72
92
  'readable_id',
73
93
  'safe_module',
74
94
  'module_of',
95
+ 'build_name_index',
75
96
  'resolve_callee',
76
97
  'write_file',
77
98
  'get_cc',
@@ -159,16 +159,17 @@ def _render_flow_edges(
159
159
  lines: List[str],
160
160
  funcs: Dict[str, Any],
161
161
  readable_id: Callable[[str], str],
162
- resolve: Callable[[str, Dict[str, Any]], Optional[str]],
162
+ resolve: Callable[..., Optional[str]],
163
163
  calls_per_function: int = 10,
164
164
  limit: Optional[int] = 200,
165
+ name_index: Optional[Dict[str, List[str]]] = None,
165
166
  ) -> None:
166
167
  """Render cross-function call edges with optional limits."""
167
168
  seen_edges: Set[Tuple[str, str]] = set()
168
169
  for func_name, fi in funcs.items():
169
170
  src = readable_id(func_name)
170
171
  for callee in fi.calls[:calls_per_function]:
171
- resolved = resolve(callee, funcs)
172
+ resolved = resolve(callee, funcs, name_index) if name_index else resolve(callee, funcs)
172
173
  if resolved and resolved != func_name:
173
174
  dst = readable_id(resolved)
174
175
  edge = (src, dst)
@@ -289,6 +289,7 @@ class YAMLExporter(BaseExporter):
289
289
  - CHAINS: call chains/paths
290
290
  - MODULES: functions grouped by module with call relationships
291
291
  """
292
+ self._name_index = None # Reset cache for fresh analysis
292
293
  connected, edges = self._collect_edges(result, max_calls_per_func, max_edges)
293
294
  nodes = self._build_nodes(result, connected)
294
295
  modules = self._group_by_module(result, connected)
@@ -4,7 +4,7 @@ Provides query normalization, intent matching, and entity resolution
4
4
  with multilingual support and fuzzy matching.
5
5
  """
6
6
 
7
- __version__ = "0.5.134"
7
+ __version__ = "0.5.136"
8
8
 
9
9
  from .pipeline import NLPPipeline
10
10
  from .normalization import QueryNormalizer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2llm
3
- Version: 0.5.134
3
+ Version: 0.5.136
4
4
  Summary: High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries
5
5
  Home-page: https://github.com/wronai/stts
6
6
  Author: STTS Project
@@ -67,16 +67,18 @@ Dynamic: requires-python
67
67
 
68
68
  ## AI Cost Tracking
69
69
 
70
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.134-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$153.46-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-64.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
70
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.136-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-65.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
72
72
 
73
- - 🤖 **LLM usage:** $153.4641 (195 commits)
74
- - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
73
+ - 🤖 **LLM usage:** $7.5000 (188 commits)
74
+ - 👤 **Human dev:** ~$6526 (65.3h @ $100/h, 30min dedup)
75
75
 
76
76
  Generated on 2026-04-20 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
77
77
 
78
78
  ---
79
79
 
80
+
81
+
80
82
  This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
81
83
 
82
84
  ## 📁 Generated Files Overview
@@ -404,10 +406,10 @@ code2llm ./ -f yaml --separate-orphans
404
406
  ---
405
407
 
406
408
  **Generated by**: `code2llm ./ -f all --readme`
407
- **Analysis Date**: 2026-04-19
408
- **Total Functions**: 1115
409
- **Total Classes**: 121
410
- **Modules**: 152
409
+ **Analysis Date**: 2026-04-20
410
+ **Total Functions**: 2124
411
+ **Total Classes**: 241
412
+ **Modules**: 359
411
413
 
412
414
  For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
413
415
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2llm"
7
- version = "0.5.134"
7
+ version = "0.5.136"
8
8
  description = "High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
code2llm-0.5.134/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.134
File without changes
File without changes
File without changes
File without changes