code2llm 0.5.133__tar.gz → 0.5.135__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.133/code2llm.egg-info → code2llm-0.5.135}/PKG-INFO +6 -8
  2. {code2llm-0.5.133 → code2llm-0.5.135}/README.md +5 -7
  3. code2llm-0.5.135/VERSION +1 -0
  4. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/__init__.py +1 -1
  5. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/calls.py +5 -2
  6. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/classic.py +7 -4
  7. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/compact.py +5 -2
  8. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/flow_compact.py +15 -13
  9. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/flow_detailed.py +5 -2
  10. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/flow_full.py +5 -2
  11. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/utils.py +25 -4
  12. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid_exporter.py +0 -1
  13. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid_flow_helpers.py +3 -2
  14. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/yaml_exporter.py +34 -15
  15. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/mermaid.py +6 -2
  16. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/__init__.py +1 -1
  17. {code2llm-0.5.133 → code2llm-0.5.135/code2llm.egg-info}/PKG-INFO +6 -8
  18. {code2llm-0.5.133 → code2llm-0.5.135}/pyproject.toml +1 -1
  19. code2llm-0.5.133/VERSION +0 -1
  20. {code2llm-0.5.133 → code2llm-0.5.135}/LICENSE +0 -0
  21. {code2llm-0.5.133 → code2llm-0.5.135}/MANIFEST.in +0 -0
  22. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/__main__.py +0 -0
  23. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/__init__.py +0 -0
  24. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/call_graph.py +0 -0
  25. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/cfg.py +0 -0
  26. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/coupling.py +0 -0
  27. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/data_analysis.py +0 -0
  28. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/dfg.py +0 -0
  29. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/pipeline_classifier.py +0 -0
  30. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/pipeline_detector.py +0 -0
  31. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/pipeline_resolver.py +0 -0
  32. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/side_effects.py +0 -0
  33. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/smells.py +0 -0
  34. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/type_inference.py +0 -0
  35. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/utils/__init__.py +0 -0
  36. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/analysis/utils/ast_helpers.py +0 -0
  37. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/api.py +0 -0
  38. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli.py +0 -0
  39. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_analysis.py +0 -0
  40. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_commands.py +0 -0
  41. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/__init__.py +0 -0
  42. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/code2logic.py +0 -0
  43. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/formats.py +0 -0
  44. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/orchestrator.py +0 -0
  45. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/orchestrator_chunked.py +0 -0
  46. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/orchestrator_constants.py +0 -0
  47. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/orchestrator_handlers.py +0 -0
  48. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_exports/prompt.py +0 -0
  49. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/cli_parser.py +0 -0
  50. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/__init__.py +0 -0
  51. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/analyzer.py +0 -0
  52. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/ast_registry.py +0 -0
  53. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/config.py +0 -0
  54. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/export_pipeline.py +0 -0
  55. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/file_analyzer.py +0 -0
  56. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/file_cache.py +0 -0
  57. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/file_filter.py +0 -0
  58. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/gitignore.py +0 -0
  59. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/incremental.py +0 -0
  60. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/__init__.py +0 -0
  61. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/base.py +0 -0
  62. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/cpp.py +0 -0
  63. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/csharp.py +0 -0
  64. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/generic.py +0 -0
  65. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/go_lang.py +0 -0
  66. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/java.py +0 -0
  67. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/php.py +0 -0
  68. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/ruby.py +0 -0
  69. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/rust.py +0 -0
  70. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/ts_extractors.py +0 -0
  71. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/ts_parser.py +0 -0
  72. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/lang/typescript.py +0 -0
  73. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/large_repo.py +0 -0
  74. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/models.py +0 -0
  75. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/persistent_cache.py +0 -0
  76. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/refactoring.py +0 -0
  77. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/repo_files.py +0 -0
  78. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/__init__.py +0 -0
  79. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/cache.py +0 -0
  80. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/incremental.py +0 -0
  81. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/prioritizer.py +0 -0
  82. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/scanner.py +0 -0
  83. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming/strategies.py +0 -0
  84. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/streaming_analyzer.py +0 -0
  85. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/core/toon_size_manager.py +0 -0
  86. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/__init__.py +0 -0
  87. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/article_view.py +0 -0
  88. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/base.py +0 -0
  89. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/context_exporter.py +0 -0
  90. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/context_view.py +0 -0
  91. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/dashboard_data.py +0 -0
  92. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/dashboard_renderer.py +0 -0
  93. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/__init__.py +0 -0
  94. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/computation.py +0 -0
  95. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/constants.py +0 -0
  96. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/exclusion.py +0 -0
  97. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/render.py +0 -0
  98. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution/yaml_export.py +0 -0
  99. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/evolution_exporter.py +0 -0
  100. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/flow_constants.py +0 -0
  101. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/flow_exporter.py +0 -0
  102. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/flow_renderer.py +0 -0
  103. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/html_dashboard.py +0 -0
  104. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/index_generator/__init__.py +0 -0
  105. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/index_generator/renderer.py +0 -0
  106. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/index_generator/scanner.py +0 -0
  107. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/index_generator.py +0 -0
  108. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/json_exporter.py +0 -0
  109. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/llm_exporter.py +0 -0
  110. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/__init__.py +0 -0
  111. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/alerts.py +0 -0
  112. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/details.py +0 -0
  113. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/header.py +0 -0
  114. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/module_list.py +0 -0
  115. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/utils.py +0 -0
  116. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map/yaml_export.py +0 -0
  117. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/map_exporter.py +0 -0
  118. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/mermaid/__init__.py +0 -0
  119. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/__init__.py +0 -0
  120. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/constants.py +0 -0
  121. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/core.py +0 -0
  122. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/evolution.py +0 -0
  123. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/health.py +0 -0
  124. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/hotspots.py +0 -0
  125. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml/modules.py +0 -0
  126. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/project_yaml_exporter.py +0 -0
  127. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme/__init__.py +0 -0
  128. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme/content.py +0 -0
  129. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme/files.py +0 -0
  130. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme/insights.py +0 -0
  131. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme/sections.py +0 -0
  132. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/readme_exporter.py +0 -0
  133. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/report_generators.py +0 -0
  134. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/__init__.py +0 -0
  135. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/helpers.py +0 -0
  136. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/metrics.py +0 -0
  137. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/metrics_core.py +0 -0
  138. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/metrics_duplicates.py +0 -0
  139. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/metrics_health.py +0 -0
  140. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/module_detail.py +0 -0
  141. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon/renderer.py +0 -0
  142. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon.py +0 -0
  143. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/toon_view.py +0 -0
  144. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/exporters/validate_project.py +0 -0
  145. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/__init__.py +0 -0
  146. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/_utils.py +0 -0
  147. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/__init__.py +0 -0
  148. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/analysis.py +0 -0
  149. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/cli.py +0 -0
  150. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/generator.py +0 -0
  151. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/nodes.py +0 -0
  152. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/parsing.py +0 -0
  153. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow/utils.py +0 -0
  154. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_flow.py +0 -0
  155. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/llm_task.py +0 -0
  156. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/mermaid/__init__.py +0 -0
  157. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/mermaid/fix.py +0 -0
  158. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/mermaid/png.py +0 -0
  159. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/generators/mermaid/validation.py +0 -0
  160. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/config.py +0 -0
  161. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/entity_resolution.py +0 -0
  162. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/intent_matching.py +0 -0
  163. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/normalization.py +0 -0
  164. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/nlp/pipeline.py +0 -0
  165. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/parsers/toon_parser.py +0 -0
  166. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/patterns/__init__.py +0 -0
  167. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/patterns/detector.py +0 -0
  168. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/refactor/__init__.py +0 -0
  169. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm/refactor/prompt_engine.py +0 -0
  170. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm.egg-info/SOURCES.txt +0 -0
  171. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm.egg-info/dependency_links.txt +0 -0
  172. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm.egg-info/entry_points.txt +0 -0
  173. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm.egg-info/requires.txt +0 -0
  174. {code2llm-0.5.133 → code2llm-0.5.135}/code2llm.egg-info/top_level.txt +0 -0
  175. {code2llm-0.5.133 → code2llm-0.5.135}/setup.cfg +0 -0
  176. {code2llm-0.5.133 → code2llm-0.5.135}/setup.py +0 -0
  177. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_advanced_analysis.py +0 -0
  178. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_analyzer.py +0 -0
  179. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_calls_toon_export.py +0 -0
  180. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_deep_analysis.py +0 -0
  181. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_edge_cases.py +0 -0
  182. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_flow_exporter.py +0 -0
  183. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_format_quality.py +0 -0
  184. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_multilanguage_e2e.py +0 -0
  185. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_nlp_pipeline.py +0 -0
  186. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_nonpython_cc_calls.py +0 -0
  187. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_persistent_cache.py +0 -0
  188. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_pipeline_detector.py +0 -0
  189. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_project_toon_export.py +0 -0
  190. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_prompt_engine.py +0 -0
  191. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_prompt_txt.py +0 -0
  192. {code2llm-0.5.133 → code2llm-0.5.135}/tests/test_refactoring_engine.py +0 -0
  193. {code2llm-0.5.133 → code2llm-0.5.135}/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.133
3
+ Version: 0.5.135
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,18 +67,16 @@ 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.133-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-57.3h-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.135-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)
72
72
 
73
- - 🤖 **LLM usage:** $7.5000 (166 commits)
74
- - 👤 **Human dev:** ~$5731 (57.3h @ $100/h, 30min dedup)
73
+ - 🤖 **LLM usage:** $153.4641 (195 commits)
74
+ - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
75
75
 
76
- Generated on 2026-04-19 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
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
-
82
80
  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.
83
81
 
84
82
  ## 📁 Generated Files Overview
@@ -3,18 +3,16 @@
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.133-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-57.3h-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.135-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)
8
8
 
9
- - 🤖 **LLM usage:** $7.5000 (166 commits)
10
- - 👤 **Human dev:** ~$5731 (57.3h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $153.4641 (195 commits)
10
+ - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
11
11
 
12
- Generated on 2026-04-19 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
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
-
18
16
  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.
19
17
 
20
18
  ## 📁 Generated Files Overview
@@ -0,0 +1 @@
1
+ 0.5.135
@@ -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.133"
11
+ __version__ = "0.5.135"
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',
@@ -72,4 +72,3 @@ class MermaidExporter(BaseExporter):
72
72
  _should_skip_module = staticmethod(_should_skip_module)
73
73
  _is_entry_point = staticmethod(_is_entry_point)
74
74
  _find_critical_path = staticmethod(_find_critical_path)
75
-
@@ -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)
@@ -15,6 +15,17 @@ class YAMLExporter(BaseExporter):
15
15
 
16
16
  def __init__(self):
17
17
  self.analyzer = DataAnalyzer()
18
+ self._name_index: Optional[Dict[str, List[str]]] = None
19
+
20
+ def _get_name_index(self, funcs: Dict[str, FunctionInfo]) -> Dict[str, List[str]]:
21
+ """Build index mapping simple names to qualified names for O(1) lookup."""
22
+ if self._name_index is None:
23
+ index: Dict[str, List[str]] = defaultdict(list)
24
+ for qn in funcs:
25
+ simple_name = qn.split('.')[-1]
26
+ index[simple_name].append(qn)
27
+ self._name_index = index
28
+ return self._name_index
18
29
 
19
30
  def export(
20
31
  self,
@@ -126,6 +137,7 @@ class YAMLExporter(BaseExporter):
126
137
  - modules: grouping of functions by module
127
138
  - stats: summary statistics
128
139
  """
140
+ self._name_index = None # Reset cache for fresh analysis
129
141
  connected, edges = self._collect_edges(result, max_calls_per_func, max_edges)
130
142
  nodes = self._build_nodes(result, connected)
131
143
  modules = self._group_by_module(result, connected)
@@ -186,14 +198,15 @@ class YAMLExporter(BaseExporter):
186
198
 
187
199
  def _build_nodes(self, result: AnalysisResult, connected: Set[str]) -> Dict[str, Dict]:
188
200
  """Build node data for all connected functions."""
201
+ calls_in_counts = self._compute_calls_in_counts(result)
189
202
  nodes: Dict[str, Dict] = {}
190
203
  for fn in connected:
191
204
  fi = result.functions.get(fn)
192
205
  if fi:
193
- nodes[fn] = self._create_node(fi, fn, result)
206
+ nodes[fn] = self._create_node(fi, fn, calls_in_counts.get(fn, 0))
194
207
  return nodes
195
208
 
196
- def _create_node(self, fi: FunctionInfo, fn: str, result: AnalysisResult) -> Dict:
209
+ def _create_node(self, fi: FunctionInfo, fn: str, calls_in: int) -> Dict:
197
210
  """Create node dict with function metadata."""
198
211
  return {
199
212
  'name': fi.name,
@@ -201,19 +214,25 @@ class YAMLExporter(BaseExporter):
201
214
  'line': fi.line,
202
215
  'cyclomatic_complexity': self._get_cc(fi),
203
216
  'calls_out': len(fi.calls),
204
- 'calls_in': self._count_calls_in(fn, result),
217
+ 'calls_in': calls_in,
205
218
  }
206
219
 
207
- def _count_calls_in(self, fn: str, result: AnalysisResult) -> int:
208
- """Count how many functions call the given function."""
209
- count = 0
220
+ def _compute_calls_in_counts(self, result: AnalysisResult) -> Dict[str, int]:
221
+ """Pre-compute calls_in counts for all functions in O(n * avg_calls) time."""
222
+ counts: Dict[str, int] = defaultdict(int)
223
+ name_index = self._get_name_index(result.functions)
224
+
210
225
  for f in result.functions.values():
211
226
  for c in f.calls:
212
- resolved = self._resolve_callee(c, result.functions)
213
- if resolved == fn:
214
- count += 1
215
- break
216
- return count
227
+ # Fast resolution using the index
228
+ resolved = c if c in result.functions else None
229
+ if not resolved:
230
+ candidates = name_index.get(c, [])
231
+ if len(candidates) == 1:
232
+ resolved = candidates[0]
233
+ if resolved:
234
+ counts[resolved] += 1
235
+ return counts
217
236
 
218
237
  @staticmethod
219
238
  def _group_by_module(result: AnalysisResult, connected: Set[str]) -> Dict[str, List[str]]:
@@ -245,12 +264,11 @@ class YAMLExporter(BaseExporter):
245
264
 
246
265
  return calls_data
247
266
 
248
- @staticmethod
249
- def _resolve_callee(callee: str, funcs: Dict[str, FunctionInfo]) -> Optional[str]:
250
- """Resolve callee to a known qualified name."""
267
+ def _resolve_callee(self, callee: str, funcs: Dict[str, FunctionInfo]) -> Optional[str]:
268
+ """Resolve callee to a known qualified name using O(1) index lookup."""
251
269
  if callee in funcs:
252
270
  return callee
253
- candidates = [qn for qn in funcs if qn.endswith(f".{callee}")]
271
+ candidates = self._get_name_index(funcs).get(callee, [])
254
272
  if len(candidates) == 1:
255
273
  return candidates[0]
256
274
  return None
@@ -271,6 +289,7 @@ class YAMLExporter(BaseExporter):
271
289
  - CHAINS: call chains/paths
272
290
  - MODULES: functions grouped by module with call relationships
273
291
  """
292
+ self._name_index = None # Reset cache for fresh analysis
274
293
  connected, edges = self._collect_edges(result, max_calls_per_func, max_edges)
275
294
  nodes = self._build_nodes(result, connected)
276
295
  modules = self._group_by_module(result, connected)
@@ -67,8 +67,8 @@ __all__ = [
67
67
  ]
68
68
 
69
69
 
70
- if __name__ == '__main__':
71
- # CLI interface for testing
70
+ def run_cli() -> None:
71
+ """Run the CLI interface for generating PNGs from Mermaid files."""
72
72
  import argparse
73
73
 
74
74
  parser = argparse.ArgumentParser(description='Generate PNG from Mermaid files')
@@ -82,3 +82,7 @@ if __name__ == '__main__':
82
82
 
83
83
  count = generate_pngs(input_path, output_path)
84
84
  print(f"Generated {count} PNG files")
85
+
86
+
87
+ if __name__ == '__main__':
88
+ run_cli()
@@ -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.133"
7
+ __version__ = "0.5.135"
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.133
3
+ Version: 0.5.135
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,18 +67,16 @@ 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.133-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-57.3h-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.135-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)
72
72
 
73
- - 🤖 **LLM usage:** $7.5000 (166 commits)
74
- - 👤 **Human dev:** ~$5731 (57.3h @ $100/h, 30min dedup)
73
+ - 🤖 **LLM usage:** $153.4641 (195 commits)
74
+ - 👤 **Human dev:** ~$6447 (64.5h @ $100/h, 30min dedup)
75
75
 
76
- Generated on 2026-04-19 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
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
-
82
80
  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.
83
81
 
84
82
  ## 📁 Generated Files Overview
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2llm"
7
- version = "0.5.133"
7
+ version = "0.5.135"
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.133/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.133
File without changes
File without changes
File without changes
File without changes