code2llm 0.5.106__tar.gz → 0.5.108__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 (128) hide show
  1. {code2llm-0.5.106 → code2llm-0.5.108}/PKG-INFO +2 -2
  2. {code2llm-0.5.106 → code2llm-0.5.108}/README.md +1 -1
  3. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/__init__.py +1 -1
  4. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_exports/orchestrator.py +3 -0
  5. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/yaml_exporter.py +63 -28
  6. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/__init__.py +1 -1
  7. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/PKG-INFO +2 -2
  8. {code2llm-0.5.106 → code2llm-0.5.108}/pyproject.toml +1 -1
  9. {code2llm-0.5.106 → code2llm-0.5.108}/setup.py +1 -1
  10. {code2llm-0.5.106 → code2llm-0.5.108}/LICENSE +0 -0
  11. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/__main__.py +0 -0
  12. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/__init__.py +0 -0
  13. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/call_graph.py +0 -0
  14. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/cfg.py +0 -0
  15. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/coupling.py +0 -0
  16. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/data_analysis.py +0 -0
  17. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/dfg.py +0 -0
  18. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/pipeline_detector.py +0 -0
  19. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/side_effects.py +0 -0
  20. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/smells.py +0 -0
  21. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/type_inference.py +0 -0
  22. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/utils/__init__.py +0 -0
  23. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/analysis/utils/ast_helpers.py +0 -0
  24. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/api.py +0 -0
  25. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli.py +0 -0
  26. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_analysis.py +0 -0
  27. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_commands.py +0 -0
  28. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_exports/__init__.py +0 -0
  29. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_exports/code2logic.py +0 -0
  30. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_exports/formats.py +0 -0
  31. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_exports/prompt.py +0 -0
  32. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/cli_parser.py +0 -0
  33. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/__init__.py +0 -0
  34. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/analyzer.py +0 -0
  35. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/ast_registry.py +0 -0
  36. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/config.py +0 -0
  37. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/export_pipeline.py +0 -0
  38. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/file_analyzer.py +0 -0
  39. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/file_cache.py +0 -0
  40. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/file_filter.py +0 -0
  41. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/gitignore.py +0 -0
  42. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/incremental.py +0 -0
  43. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/__init__.py +0 -0
  44. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/base.py +0 -0
  45. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/cpp.py +0 -0
  46. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/csharp.py +0 -0
  47. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/generic.py +0 -0
  48. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/go_lang.py +0 -0
  49. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/java.py +0 -0
  50. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/php.py +0 -0
  51. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/ruby.py +0 -0
  52. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/rust.py +0 -0
  53. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/ts_extractors.py +0 -0
  54. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/ts_parser.py +0 -0
  55. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/lang/typescript.py +0 -0
  56. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/large_repo.py +0 -0
  57. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/models.py +0 -0
  58. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/refactoring.py +0 -0
  59. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/repo_files.py +0 -0
  60. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/__init__.py +0 -0
  61. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/cache.py +0 -0
  62. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/incremental.py +0 -0
  63. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/prioritizer.py +0 -0
  64. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/scanner.py +0 -0
  65. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming/strategies.py +0 -0
  66. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/streaming_analyzer.py +0 -0
  67. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/core/toon_size_manager.py +0 -0
  68. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/__init__.py +0 -0
  69. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/article_view.py +0 -0
  70. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/base.py +0 -0
  71. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/context_exporter.py +0 -0
  72. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/context_view.py +0 -0
  73. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/evolution_exporter.py +0 -0
  74. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/flow_constants.py +0 -0
  75. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/flow_exporter.py +0 -0
  76. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/flow_renderer.py +0 -0
  77. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/html_dashboard.py +0 -0
  78. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/index_generator.py +0 -0
  79. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/json_exporter.py +0 -0
  80. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/llm_exporter.py +0 -0
  81. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/map_exporter.py +0 -0
  82. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/mermaid_exporter.py +0 -0
  83. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/mermaid_flow_helpers.py +0 -0
  84. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/project_yaml_exporter.py +0 -0
  85. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/readme_exporter.py +0 -0
  86. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/report_generators.py +0 -0
  87. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon/__init__.py +0 -0
  88. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon/helpers.py +0 -0
  89. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon/metrics.py +0 -0
  90. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon/module_detail.py +0 -0
  91. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon/renderer.py +0 -0
  92. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon.py +0 -0
  93. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/toon_view.py +0 -0
  94. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/exporters/validate_project.py +0 -0
  95. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/generators/__init__.py +0 -0
  96. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/generators/llm_flow.py +0 -0
  97. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/generators/llm_task.py +0 -0
  98. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/generators/mermaid.py +0 -0
  99. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/config.py +0 -0
  100. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/entity_resolution.py +0 -0
  101. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/intent_matching.py +0 -0
  102. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/normalization.py +0 -0
  103. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/nlp/pipeline.py +0 -0
  104. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/patterns/__init__.py +0 -0
  105. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/patterns/detector.py +0 -0
  106. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/refactor/__init__.py +0 -0
  107. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm/refactor/prompt_engine.py +0 -0
  108. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/SOURCES.txt +0 -0
  109. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/dependency_links.txt +0 -0
  110. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/entry_points.txt +0 -0
  111. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/requires.txt +0 -0
  112. {code2llm-0.5.106 → code2llm-0.5.108}/code2llm.egg-info/top_level.txt +0 -0
  113. {code2llm-0.5.106 → code2llm-0.5.108}/setup.cfg +0 -0
  114. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_advanced_analysis.py +0 -0
  115. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_analyzer.py +0 -0
  116. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_deep_analysis.py +0 -0
  117. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_edge_cases.py +0 -0
  118. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_flow_exporter.py +0 -0
  119. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_format_quality.py +0 -0
  120. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_multilanguage_e2e.py +0 -0
  121. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_nlp_pipeline.py +0 -0
  122. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_nonpython_cc_calls.py +0 -0
  123. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_pipeline_detector.py +0 -0
  124. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_project_toon_export.py +0 -0
  125. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_prompt_engine.py +0 -0
  126. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_prompt_txt.py +0 -0
  127. {code2llm-0.5.106 → code2llm-0.5.108}/tests/test_refactoring_engine.py +0 -0
  128. {code2llm-0.5.106 → code2llm-0.5.108}/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.106
3
+ Version: 0.5.108
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
@@ -66,7 +66,7 @@ Dynamic: requires-python
66
66
 
67
67
  ## AI Cost Tracking
68
68
 
69
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.106-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
69
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.108-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
70
70
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-53.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
71
71
 
72
72
  - 🤖 **LLM usage:** $7.5000 (154 commits)
@@ -3,7 +3,7 @@
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.106-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
6
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.108-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
7
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-53.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
9
  - 🤖 **LLM usage:** $7.5000 (154 commits)
@@ -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.106"
11
+ __version__ = "0.5.108"
12
12
  __author__ = "STTS Project"
13
13
 
14
14
  # Core analysis components (lightweight, always needed)
@@ -103,6 +103,9 @@ def _export_chunked_results(
103
103
  _export_simple_formats(args, result, output_dir, ['toon', 'context'])
104
104
  _export_evolution(args, result, output_dir)
105
105
 
106
+ if 'calls' in formats:
107
+ _export_calls(args, result, output_dir)
108
+
106
109
  if 'all' in requested_formats:
107
110
  _export_project_toon(args, result, output_dir)
108
111
 
@@ -117,13 +117,24 @@ class YAMLExporter(Exporter):
117
117
  - modules: grouping of functions by module
118
118
  - stats: summary statistics
119
119
  """
120
- # Collect connected nodes and edges
120
+ connected, edges = self._collect_edges(result, max_calls_per_func, max_edges)
121
+ nodes = self._build_nodes(result, connected)
122
+ modules = self._group_by_module(result, connected)
123
+
124
+ calls_data = self._build_calls_data(result, nodes, edges, modules)
125
+
126
+ Path(output_path).parent.mkdir(parents=True, exist_ok=True)
127
+ with open(output_path, 'w', encoding='utf-8') as f:
128
+ yaml.dump(calls_data, f, default_flow_style=False, allow_unicode=True, sort_keys=False)
129
+
130
+ def _collect_edges(self, result: AnalysisResult, max_calls: int, max_edges: int) -> Tuple[Set[str], List[Dict]]:
131
+ """Collect connected nodes and edges from function calls."""
121
132
  connected: Set[str] = set()
122
133
  edges: List[Dict] = []
123
134
  seen_pairs: Set[Tuple[str, str]] = set()
124
135
 
125
136
  for func_name, fi in result.functions.items():
126
- for callee in fi.calls[:max_calls_per_func]:
137
+ for callee in fi.calls[:max_calls]:
127
138
  resolved = self._resolve_callee(callee, result.functions)
128
139
  if resolved and resolved != func_name:
129
140
  connected.add(func_name)
@@ -131,39 +142,66 @@ class YAMLExporter(Exporter):
131
142
  pair = (func_name, resolved)
132
143
  if pair not in seen_pairs:
133
144
  seen_pairs.add(pair)
134
- edges.append({
135
- 'caller': func_name,
136
- 'callee': resolved,
137
- 'call_type': 'direct' if callee == resolved.split('.')[-1] else 'resolved'
138
- })
145
+ edges.append(self._create_edge(func_name, resolved, callee))
139
146
  if len(edges) >= max_edges:
140
- break
147
+ return connected, edges
141
148
  if len(edges) >= max_edges:
142
- break
149
+ return connected, edges
143
150
 
144
- # Build nodes data
151
+ return connected, edges
152
+
153
+ @staticmethod
154
+ def _create_edge(caller: str, resolved: str, callee: str) -> Dict:
155
+ """Create edge dict with call type classification."""
156
+ return {
157
+ 'caller': caller,
158
+ 'callee': resolved,
159
+ 'call_type': 'direct' if callee == resolved.split('.')[-1] else 'resolved'
160
+ }
161
+
162
+ def _build_nodes(self, result: AnalysisResult, connected: Set[str]) -> Dict[str, Dict]:
163
+ """Build node data for all connected functions."""
145
164
  nodes: Dict[str, Dict] = {}
146
165
  for fn in connected:
147
166
  fi = result.functions.get(fn)
148
167
  if fi:
149
- cc = self._get_cc(fi)
150
- nodes[fn] = {
151
- 'name': fi.name,
152
- 'module': fi.module,
153
- 'line': fi.line,
154
- 'cyclomatic_complexity': cc,
155
- 'calls_out': len(fi.calls),
156
- 'calls_in': sum(1 for f in result.functions.values() if fn in [self._resolve_callee(c, result.functions) for c in f.calls]),
157
- }
158
-
159
- # Group by module
168
+ nodes[fn] = self._create_node(fi, fn, result)
169
+ return nodes
170
+
171
+ def _create_node(self, fi: FunctionInfo, fn: str, result: AnalysisResult) -> Dict:
172
+ """Create node dict with function metadata."""
173
+ return {
174
+ 'name': fi.name,
175
+ 'module': fi.module,
176
+ 'line': fi.line,
177
+ 'cyclomatic_complexity': self._get_cc(fi),
178
+ 'calls_out': len(fi.calls),
179
+ 'calls_in': self._count_calls_in(fn, result),
180
+ }
181
+
182
+ def _count_calls_in(self, fn: str, result: AnalysisResult) -> int:
183
+ """Count how many functions call the given function."""
184
+ count = 0
185
+ for f in result.functions.values():
186
+ for c in f.calls:
187
+ resolved = self._resolve_callee(c, result.functions)
188
+ if resolved == fn:
189
+ count += 1
190
+ break
191
+ return count
192
+
193
+ @staticmethod
194
+ def _group_by_module(result: AnalysisResult, connected: Set[str]) -> Dict[str, List[str]]:
195
+ """Group connected functions by their module."""
160
196
  modules: Dict[str, List[str]] = defaultdict(list)
161
197
  for fn in connected:
162
198
  fi = result.functions.get(fn)
163
199
  if fi:
164
200
  modules[fi.module].append(fn)
165
-
166
- # Build output structure
201
+ return {mod: sorted(funcs) for mod, funcs in sorted(modules.items())}
202
+
203
+ def _build_calls_data(self, result: AnalysisResult, nodes: Dict, edges: List, modules: Dict) -> Dict:
204
+ """Build the final calls.yaml data structure."""
167
205
  calls_data = {
168
206
  'project': result.project_path,
169
207
  'generated_from': 'code2llm call graph analysis',
@@ -174,16 +212,13 @@ class YAMLExporter(Exporter):
174
212
  },
175
213
  'nodes': nodes,
176
214
  'edges': edges,
177
- 'modules': {mod: sorted(funcs) for mod, funcs in sorted(modules.items())},
215
+ 'modules': modules,
178
216
  }
179
217
 
180
- # Add entry points if available
181
218
  if result.entry_points:
182
219
  calls_data['entry_points'] = sorted(result.entry_points)
183
220
 
184
- Path(output_path).parent.mkdir(parents=True, exist_ok=True)
185
- with open(output_path, 'w', encoding='utf-8') as f:
186
- yaml.dump(calls_data, f, default_flow_style=False, allow_unicode=True, sort_keys=False)
221
+ return calls_data
187
222
 
188
223
  @staticmethod
189
224
  def _resolve_callee(callee: str, funcs: Dict[str, FunctionInfo]) -> Optional[str]:
@@ -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.106"
7
+ __version__ = "0.5.108"
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.106
3
+ Version: 0.5.108
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
@@ -66,7 +66,7 @@ Dynamic: requires-python
66
66
 
67
67
  ## AI Cost Tracking
68
68
 
69
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.106-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
69
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.108-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
70
70
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-53.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
71
71
 
72
72
  - 🤖 **LLM usage:** $7.5000 (154 commits)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2llm"
7
- version = "0.5.106"
7
+ version = "0.5.108"
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"
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
  import os
5
5
 
6
6
  # Read version
7
- version = "0.5.105"
7
+ version = "0.5.107"
8
8
 
9
9
  # Read long description
10
10
  def read_readme():
File without changes
File without changes
File without changes
File without changes