code2llm 0.5.132__tar.gz → 0.5.134__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.132/code2llm.egg-info → code2llm-0.5.134}/PKG-INFO +6 -8
  2. {code2llm-0.5.132 → code2llm-0.5.134}/README.md +5 -7
  3. code2llm-0.5.134/VERSION +1 -0
  4. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/__init__.py +1 -1
  5. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/analyzer.py +0 -15
  6. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/file_filter.py +3 -13
  7. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/gitignore.py +0 -11
  8. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid_exporter.py +0 -1
  9. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/yaml_exporter.py +33 -15
  10. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/mermaid.py +6 -2
  11. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/__init__.py +1 -1
  12. {code2llm-0.5.132 → code2llm-0.5.134/code2llm.egg-info}/PKG-INFO +6 -8
  13. {code2llm-0.5.132 → code2llm-0.5.134}/pyproject.toml +1 -1
  14. code2llm-0.5.132/VERSION +0 -1
  15. {code2llm-0.5.132 → code2llm-0.5.134}/LICENSE +0 -0
  16. {code2llm-0.5.132 → code2llm-0.5.134}/MANIFEST.in +0 -0
  17. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/__main__.py +0 -0
  18. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/__init__.py +0 -0
  19. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/call_graph.py +0 -0
  20. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/cfg.py +0 -0
  21. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/coupling.py +0 -0
  22. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/data_analysis.py +0 -0
  23. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/dfg.py +0 -0
  24. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/pipeline_classifier.py +0 -0
  25. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/pipeline_detector.py +0 -0
  26. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/pipeline_resolver.py +0 -0
  27. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/side_effects.py +0 -0
  28. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/smells.py +0 -0
  29. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/type_inference.py +0 -0
  30. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/utils/__init__.py +0 -0
  31. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/analysis/utils/ast_helpers.py +0 -0
  32. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/api.py +0 -0
  33. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli.py +0 -0
  34. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_analysis.py +0 -0
  35. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_commands.py +0 -0
  36. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/__init__.py +0 -0
  37. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/code2logic.py +0 -0
  38. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/formats.py +0 -0
  39. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/orchestrator.py +0 -0
  40. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/orchestrator_chunked.py +0 -0
  41. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/orchestrator_constants.py +0 -0
  42. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/orchestrator_handlers.py +0 -0
  43. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_exports/prompt.py +0 -0
  44. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/cli_parser.py +0 -0
  45. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/__init__.py +0 -0
  46. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/ast_registry.py +0 -0
  47. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/config.py +0 -0
  48. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/export_pipeline.py +0 -0
  49. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/file_analyzer.py +0 -0
  50. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/file_cache.py +0 -0
  51. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/incremental.py +0 -0
  52. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/__init__.py +0 -0
  53. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/base.py +0 -0
  54. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/cpp.py +0 -0
  55. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/csharp.py +0 -0
  56. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/generic.py +0 -0
  57. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/go_lang.py +0 -0
  58. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/java.py +0 -0
  59. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/php.py +0 -0
  60. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/ruby.py +0 -0
  61. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/rust.py +0 -0
  62. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/ts_extractors.py +0 -0
  63. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/ts_parser.py +0 -0
  64. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/lang/typescript.py +0 -0
  65. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/large_repo.py +0 -0
  66. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/models.py +0 -0
  67. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/persistent_cache.py +0 -0
  68. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/refactoring.py +0 -0
  69. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/repo_files.py +0 -0
  70. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/__init__.py +0 -0
  71. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/cache.py +0 -0
  72. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/incremental.py +0 -0
  73. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/prioritizer.py +0 -0
  74. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/scanner.py +0 -0
  75. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming/strategies.py +0 -0
  76. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/streaming_analyzer.py +0 -0
  77. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/core/toon_size_manager.py +0 -0
  78. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/__init__.py +0 -0
  79. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/article_view.py +0 -0
  80. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/base.py +0 -0
  81. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/context_exporter.py +0 -0
  82. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/context_view.py +0 -0
  83. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/dashboard_data.py +0 -0
  84. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/dashboard_renderer.py +0 -0
  85. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/__init__.py +0 -0
  86. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/computation.py +0 -0
  87. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/constants.py +0 -0
  88. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/exclusion.py +0 -0
  89. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/render.py +0 -0
  90. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution/yaml_export.py +0 -0
  91. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/evolution_exporter.py +0 -0
  92. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/flow_constants.py +0 -0
  93. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/flow_exporter.py +0 -0
  94. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/flow_renderer.py +0 -0
  95. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/html_dashboard.py +0 -0
  96. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/index_generator/__init__.py +0 -0
  97. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/index_generator/renderer.py +0 -0
  98. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/index_generator/scanner.py +0 -0
  99. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/index_generator.py +0 -0
  100. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/json_exporter.py +0 -0
  101. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/llm_exporter.py +0 -0
  102. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/__init__.py +0 -0
  103. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/alerts.py +0 -0
  104. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/details.py +0 -0
  105. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/header.py +0 -0
  106. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/module_list.py +0 -0
  107. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/utils.py +0 -0
  108. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map/yaml_export.py +0 -0
  109. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/map_exporter.py +0 -0
  110. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/__init__.py +0 -0
  111. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/calls.py +0 -0
  112. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/classic.py +0 -0
  113. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/compact.py +0 -0
  114. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/flow_compact.py +0 -0
  115. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/flow_detailed.py +0 -0
  116. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/flow_full.py +0 -0
  117. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid/utils.py +0 -0
  118. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/mermaid_flow_helpers.py +0 -0
  119. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/__init__.py +0 -0
  120. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/constants.py +0 -0
  121. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/core.py +0 -0
  122. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/evolution.py +0 -0
  123. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/health.py +0 -0
  124. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/hotspots.py +0 -0
  125. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml/modules.py +0 -0
  126. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/project_yaml_exporter.py +0 -0
  127. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme/__init__.py +0 -0
  128. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme/content.py +0 -0
  129. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme/files.py +0 -0
  130. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme/insights.py +0 -0
  131. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme/sections.py +0 -0
  132. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/readme_exporter.py +0 -0
  133. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/report_generators.py +0 -0
  134. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/__init__.py +0 -0
  135. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/helpers.py +0 -0
  136. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/metrics.py +0 -0
  137. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/metrics_core.py +0 -0
  138. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/metrics_duplicates.py +0 -0
  139. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/metrics_health.py +0 -0
  140. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/module_detail.py +0 -0
  141. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon/renderer.py +0 -0
  142. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon.py +0 -0
  143. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/toon_view.py +0 -0
  144. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/exporters/validate_project.py +0 -0
  145. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/__init__.py +0 -0
  146. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/_utils.py +0 -0
  147. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/__init__.py +0 -0
  148. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/analysis.py +0 -0
  149. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/cli.py +0 -0
  150. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/generator.py +0 -0
  151. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/nodes.py +0 -0
  152. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/parsing.py +0 -0
  153. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow/utils.py +0 -0
  154. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_flow.py +0 -0
  155. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/llm_task.py +0 -0
  156. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/mermaid/__init__.py +0 -0
  157. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/mermaid/fix.py +0 -0
  158. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/mermaid/png.py +0 -0
  159. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/generators/mermaid/validation.py +0 -0
  160. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/config.py +0 -0
  161. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/entity_resolution.py +0 -0
  162. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/intent_matching.py +0 -0
  163. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/normalization.py +0 -0
  164. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/nlp/pipeline.py +0 -0
  165. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/parsers/toon_parser.py +0 -0
  166. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/patterns/__init__.py +0 -0
  167. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/patterns/detector.py +0 -0
  168. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/refactor/__init__.py +0 -0
  169. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm/refactor/prompt_engine.py +0 -0
  170. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm.egg-info/SOURCES.txt +0 -0
  171. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm.egg-info/dependency_links.txt +0 -0
  172. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm.egg-info/entry_points.txt +0 -0
  173. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm.egg-info/requires.txt +0 -0
  174. {code2llm-0.5.132 → code2llm-0.5.134}/code2llm.egg-info/top_level.txt +0 -0
  175. {code2llm-0.5.132 → code2llm-0.5.134}/setup.cfg +0 -0
  176. {code2llm-0.5.132 → code2llm-0.5.134}/setup.py +0 -0
  177. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_advanced_analysis.py +0 -0
  178. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_analyzer.py +0 -0
  179. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_calls_toon_export.py +0 -0
  180. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_deep_analysis.py +0 -0
  181. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_edge_cases.py +0 -0
  182. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_flow_exporter.py +0 -0
  183. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_format_quality.py +0 -0
  184. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_multilanguage_e2e.py +0 -0
  185. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_nlp_pipeline.py +0 -0
  186. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_nonpython_cc_calls.py +0 -0
  187. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_persistent_cache.py +0 -0
  188. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_pipeline_detector.py +0 -0
  189. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_project_toon_export.py +0 -0
  190. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_prompt_engine.py +0 -0
  191. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_prompt_txt.py +0 -0
  192. {code2llm-0.5.132 → code2llm-0.5.134}/tests/test_refactoring_engine.py +0 -0
  193. {code2llm-0.5.132 → code2llm-0.5.134}/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.132
3
+ Version: 0.5.134
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.132-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.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)
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.132-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.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)
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.134
@@ -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.132"
11
+ __version__ = "0.5.134"
12
12
  __author__ = "STTS Project"
13
13
 
14
14
  # Core analysis components (lightweight, always needed)
@@ -43,12 +43,7 @@ class ProjectAnalyzer:
43
43
  def analyze_project(self, project_path: str) -> AnalysisResult:
44
44
  """Analyze entire project."""
45
45
  start_time = time.time()
46
- print(f"DEBUG analyze_project: input project_path={project_path}")
47
- print(f"DEBUG analyze_project: self.project_path before={self.project_path}")
48
46
  project_path = self._resolve_project_path(project_path)
49
- print(f"DEBUG analyze_project: project_path after resolve={project_path}")
50
- print(f"DEBUG analyze_project: self.project_path after={self.project_path}")
51
- print(f"DEBUG analyze_project: file_filter.project_path={self.file_filter.project_path}")
52
47
  files = self._collect_files(project_path)
53
48
 
54
49
  if self.config.verbose:
@@ -67,9 +62,7 @@ class ProjectAnalyzer:
67
62
  print(f" ... and {len(files_to_analyze) - 10} more")
68
63
  print()
69
64
 
70
- print(f"DEBUG analyze_project: files_to_analyze={len(files_to_analyze)}")
71
65
  fresh_results = self._run_analysis(files_to_analyze)
72
- print(f"DEBUG analyze_project: fresh_results={len(fresh_results)}")
73
66
  self._store_to_persistent_cache(pcache, files_to_analyze, fresh_results)
74
67
 
75
68
  merged = self._merge_results(cached_results + fresh_results, str(project_path))
@@ -214,10 +207,6 @@ class ProjectAnalyzer:
214
207
  if not self.file_filter.should_process(file_str):
215
208
  continue
216
209
 
217
- # DEBUG
218
- if 'vendor' in file_str.lower():
219
- print(f"DEBUG _collect_files: COLLECTED vendor file: {file_str}")
220
-
221
210
  # Calculate module name from relative path
222
211
  rel = os.path.relpath(file_str, project_str)
223
212
  parts = rel.replace('\\', '/').split('/')
@@ -231,10 +220,6 @@ class ProjectAnalyzer:
231
220
 
232
221
  files.append((file_str, module_name))
233
222
 
234
- # DEBUG
235
- vendor_count = len([f for f, m in files if 'vendor' in f.lower()])
236
- print(f"DEBUG _collect_files: total={len(files)}, vendor={vendor_count}")
237
-
238
223
  return files
239
224
 
240
225
  def _analyze_parallel(self, files: List[Tuple[str, str]]) -> List[Dict]:
@@ -98,20 +98,10 @@ class FastFileFilter:
98
98
  path_lower = file_path.lower()
99
99
  basename_lower = Path(file_path).name.lower()
100
100
 
101
- passes_gitignore = self._passes_gitignore(file_path)
102
- passes_excludes = self._passes_excludes(path_lower, basename_lower)
103
- passes_includes = self._passes_includes(path_lower)
104
-
105
- # DEBUG
106
- if 'vendor' in file_path.lower():
107
- print(f"DEBUG should_process: {file_path}")
108
- print(f" passes_gitignore={passes_gitignore}, passes_excludes={passes_excludes}, passes_includes={passes_includes}")
109
- print(f" _gitignore_parser={self._gitignore_parser}, project_path={self.project_path}")
110
-
111
101
  return (
112
- passes_gitignore and
113
- passes_excludes and
114
- passes_includes
102
+ self._passes_gitignore(file_path) and
103
+ self._passes_excludes(path_lower, basename_lower) and
104
+ self._passes_includes(path_lower)
115
105
  )
116
106
 
117
107
  def _passes_line_count(self, line_count: int) -> bool:
@@ -110,22 +110,11 @@ class GitIgnoreParser:
110
110
  except ValueError:
111
111
  return False
112
112
 
113
- # DEBUG
114
- if 'vendor' in path_str:
115
- print(f"DEBUG is_ignored: path_str={path_str}, entries={len(self._entries)}")
116
-
117
113
  ignored = False
118
114
  for entry in self._entries:
119
115
  if entry.regex.search(path_str):
120
- # DEBUG
121
- if 'vendor' in path_str:
122
- print(f"DEBUG is_ignored: MATCHED pattern={entry.regex.pattern}, is_negated={entry.is_negated}")
123
116
  ignored = not entry.is_negated
124
117
 
125
- # DEBUG
126
- if 'vendor' in path_str:
127
- print(f"DEBUG is_ignored: result={ignored}")
128
-
129
118
  return ignored
130
119
 
131
120
 
@@ -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
-
@@ -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
@@ -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.132"
7
+ __version__ = "0.5.134"
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.132
3
+ Version: 0.5.134
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.132-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.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)
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.132"
7
+ version = "0.5.134"
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.132/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.132
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes