code2llm 0.5.140__tar.gz → 0.5.142__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 (194) hide show
  1. {code2llm-0.5.140/code2llm.egg-info → code2llm-0.5.142}/PKG-INFO +2 -2
  2. {code2llm-0.5.140 → code2llm-0.5.142}/README.md +1 -1
  3. code2llm-0.5.142/VERSION +1 -0
  4. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/__init__.py +1 -1
  5. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/orchestrator.py +18 -0
  6. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/__init__.py +1 -1
  7. {code2llm-0.5.140 → code2llm-0.5.142/code2llm.egg-info}/PKG-INFO +2 -2
  8. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm.egg-info/SOURCES.txt +1 -0
  9. {code2llm-0.5.140 → code2llm-0.5.142}/pyproject.toml +1 -1
  10. code2llm-0.5.142/tests/test_orchestrator_cache_mtime.py +54 -0
  11. code2llm-0.5.140/VERSION +0 -1
  12. {code2llm-0.5.140 → code2llm-0.5.142}/LICENSE +0 -0
  13. {code2llm-0.5.140 → code2llm-0.5.142}/MANIFEST.in +0 -0
  14. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/__main__.py +0 -0
  15. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/__init__.py +0 -0
  16. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/call_graph.py +0 -0
  17. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/cfg.py +0 -0
  18. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/coupling.py +0 -0
  19. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/data_analysis.py +0 -0
  20. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/dfg.py +0 -0
  21. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/pipeline_classifier.py +0 -0
  22. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/pipeline_detector.py +0 -0
  23. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/pipeline_resolver.py +0 -0
  24. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/side_effects.py +0 -0
  25. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/smells.py +0 -0
  26. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/type_inference.py +0 -0
  27. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/utils/__init__.py +0 -0
  28. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/analysis/utils/ast_helpers.py +0 -0
  29. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/api.py +0 -0
  30. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli.py +0 -0
  31. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_analysis.py +0 -0
  32. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_commands.py +0 -0
  33. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/__init__.py +0 -0
  34. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/code2logic.py +0 -0
  35. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/formats.py +0 -0
  36. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/orchestrator_chunked.py +0 -0
  37. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/orchestrator_constants.py +0 -0
  38. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/orchestrator_handlers.py +0 -0
  39. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_exports/prompt.py +0 -0
  40. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/cli_parser.py +0 -0
  41. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/__init__.py +0 -0
  42. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/analyzer.py +0 -0
  43. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/ast_registry.py +0 -0
  44. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/config.py +0 -0
  45. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/export_pipeline.py +0 -0
  46. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/file_analyzer.py +0 -0
  47. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/file_cache.py +0 -0
  48. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/file_filter.py +0 -0
  49. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/gitignore.py +0 -0
  50. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/incremental.py +0 -0
  51. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/__init__.py +0 -0
  52. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/base.py +0 -0
  53. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/cpp.py +0 -0
  54. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/csharp.py +0 -0
  55. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/generic.py +0 -0
  56. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/go_lang.py +0 -0
  57. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/java.py +0 -0
  58. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/php.py +0 -0
  59. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/ruby.py +0 -0
  60. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/rust.py +0 -0
  61. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/ts_extractors.py +0 -0
  62. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/ts_parser.py +0 -0
  63. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/lang/typescript.py +0 -0
  64. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/large_repo.py +0 -0
  65. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/models.py +0 -0
  66. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/persistent_cache.py +0 -0
  67. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/refactoring.py +0 -0
  68. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/repo_files.py +0 -0
  69. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/__init__.py +0 -0
  70. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/cache.py +0 -0
  71. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/incremental.py +0 -0
  72. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/prioritizer.py +0 -0
  73. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/scanner.py +0 -0
  74. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming/strategies.py +0 -0
  75. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/streaming_analyzer.py +0 -0
  76. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/core/toon_size_manager.py +0 -0
  77. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/__init__.py +0 -0
  78. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/article_view.py +0 -0
  79. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/base.py +0 -0
  80. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/context_exporter.py +0 -0
  81. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/context_view.py +0 -0
  82. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/dashboard_data.py +0 -0
  83. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/dashboard_renderer.py +0 -0
  84. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/__init__.py +0 -0
  85. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/computation.py +0 -0
  86. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/constants.py +0 -0
  87. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/exclusion.py +0 -0
  88. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/render.py +0 -0
  89. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution/yaml_export.py +0 -0
  90. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/evolution_exporter.py +0 -0
  91. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/flow_constants.py +0 -0
  92. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/flow_exporter.py +0 -0
  93. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/flow_renderer.py +0 -0
  94. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/html_dashboard.py +0 -0
  95. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/index_generator/__init__.py +0 -0
  96. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/index_generator/renderer.py +0 -0
  97. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/index_generator/scanner.py +0 -0
  98. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/index_generator.py +0 -0
  99. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/json_exporter.py +0 -0
  100. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/llm_exporter.py +0 -0
  101. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/__init__.py +0 -0
  102. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/alerts.py +0 -0
  103. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/details.py +0 -0
  104. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/header.py +0 -0
  105. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/module_list.py +0 -0
  106. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/utils.py +0 -0
  107. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map/yaml_export.py +0 -0
  108. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/map_exporter.py +0 -0
  109. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/__init__.py +0 -0
  110. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/calls.py +0 -0
  111. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/classic.py +0 -0
  112. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/compact.py +0 -0
  113. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/flow_compact.py +0 -0
  114. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/flow_detailed.py +0 -0
  115. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/flow_full.py +0 -0
  116. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid/utils.py +0 -0
  117. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid_exporter.py +0 -0
  118. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/mermaid_flow_helpers.py +0 -0
  119. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/__init__.py +0 -0
  120. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/constants.py +0 -0
  121. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/core.py +0 -0
  122. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/evolution.py +0 -0
  123. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/health.py +0 -0
  124. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/hotspots.py +0 -0
  125. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml/modules.py +0 -0
  126. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/project_yaml_exporter.py +0 -0
  127. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme/__init__.py +0 -0
  128. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme/content.py +0 -0
  129. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme/files.py +0 -0
  130. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme/insights.py +0 -0
  131. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme/sections.py +0 -0
  132. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/readme_exporter.py +0 -0
  133. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/report_generators.py +0 -0
  134. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/__init__.py +0 -0
  135. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/helpers.py +0 -0
  136. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/metrics.py +0 -0
  137. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/metrics_core.py +0 -0
  138. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/metrics_duplicates.py +0 -0
  139. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/metrics_health.py +0 -0
  140. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/module_detail.py +0 -0
  141. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon/renderer.py +0 -0
  142. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon.py +0 -0
  143. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/toon_view.py +0 -0
  144. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/validate_project.py +0 -0
  145. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/exporters/yaml_exporter.py +0 -0
  146. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/__init__.py +0 -0
  147. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/_utils.py +0 -0
  148. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/__init__.py +0 -0
  149. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/analysis.py +0 -0
  150. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/cli.py +0 -0
  151. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/generator.py +0 -0
  152. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/nodes.py +0 -0
  153. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/parsing.py +0 -0
  154. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow/utils.py +0 -0
  155. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_flow.py +0 -0
  156. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/llm_task.py +0 -0
  157. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/mermaid/__init__.py +0 -0
  158. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/mermaid/fix.py +0 -0
  159. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/mermaid/png.py +0 -0
  160. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/mermaid/validation.py +0 -0
  161. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/generators/mermaid.py +0 -0
  162. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/config.py +0 -0
  163. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/entity_resolution.py +0 -0
  164. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/intent_matching.py +0 -0
  165. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/normalization.py +0 -0
  166. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/nlp/pipeline.py +0 -0
  167. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/parsers/toon_parser.py +0 -0
  168. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/patterns/__init__.py +0 -0
  169. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/patterns/detector.py +0 -0
  170. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/refactor/__init__.py +0 -0
  171. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm/refactor/prompt_engine.py +0 -0
  172. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm.egg-info/dependency_links.txt +0 -0
  173. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm.egg-info/entry_points.txt +0 -0
  174. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm.egg-info/requires.txt +0 -0
  175. {code2llm-0.5.140 → code2llm-0.5.142}/code2llm.egg-info/top_level.txt +0 -0
  176. {code2llm-0.5.140 → code2llm-0.5.142}/setup.cfg +0 -0
  177. {code2llm-0.5.140 → code2llm-0.5.142}/setup.py +0 -0
  178. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_advanced_analysis.py +0 -0
  179. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_analyzer.py +0 -0
  180. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_calls_toon_export.py +0 -0
  181. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_deep_analysis.py +0 -0
  182. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_edge_cases.py +0 -0
  183. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_flow_exporter.py +0 -0
  184. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_format_quality.py +0 -0
  185. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_multilanguage_e2e.py +0 -0
  186. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_nlp_pipeline.py +0 -0
  187. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_nonpython_cc_calls.py +0 -0
  188. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_persistent_cache.py +0 -0
  189. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_pipeline_detector.py +0 -0
  190. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_project_toon_export.py +0 -0
  191. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_prompt_engine.py +0 -0
  192. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_prompt_txt.py +0 -0
  193. {code2llm-0.5.140 → code2llm-0.5.142}/tests/test_refactoring_engine.py +0 -0
  194. {code2llm-0.5.140 → code2llm-0.5.142}/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.140
3
+ Version: 0.5.142
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,7 +67,7 @@ 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.140-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
70
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.142-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
71
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-66.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
72
72
 
73
73
  - 🤖 **LLM usage:** $7.5000 (190 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.140-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.142-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-66.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
9
  - 🤖 **LLM usage:** $7.5000 (190 commits)
@@ -0,0 +1 @@
1
+ 0.5.142
@@ -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.140"
11
+ __version__ = "0.5.142"
12
12
  __author__ = "STTS Project"
13
13
 
14
14
  # Core analysis components (lightweight, always needed)
@@ -4,6 +4,7 @@ Refactored to use EXPORT_REGISTRY for core format dispatch.
4
4
  Maintains backward compatibility with all existing --format values.
5
5
  """
6
6
 
7
+ import os
7
8
  import shutil
8
9
  import sys
9
10
  from pathlib import Path
@@ -164,6 +165,23 @@ def _copy_cached_export(cached_dir: Path, output_dir: Path, verbose: bool = Fals
164
165
  shutil.copytree(item, dest, dirs_exist_ok=True)
165
166
  else:
166
167
  shutil.copy2(item, dest)
168
+ # Refresh mtime so the user can tell these files were produced by
169
+ # the current run, even though the contents came from cache.
170
+ _touch_recursive(dest)
171
+
172
+
173
+ def _touch_recursive(path: Path) -> None:
174
+ """Update mtime/atime to now for `path` (and all contents if it is a dir)."""
175
+ try:
176
+ os.utime(path, None)
177
+ except OSError:
178
+ return
179
+ if path.is_dir():
180
+ for sub in path.rglob('*'):
181
+ try:
182
+ os.utime(sub, None)
183
+ except OSError:
184
+ continue
167
185
 
168
186
 
169
187
  def _copy_to_cache(output_dir: Path, cache_dir: Path, verbose: bool = False) -> None:
@@ -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.140"
7
+ __version__ = "0.5.142"
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.140
3
+ Version: 0.5.142
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,7 +67,7 @@ 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.140-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
70
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.5.142-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
71
71
  ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-66.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
72
72
 
73
73
  - 🤖 **LLM usage:** $7.5000 (190 commits)
@@ -181,6 +181,7 @@ tests/test_format_quality.py
181
181
  tests/test_multilanguage_e2e.py
182
182
  tests/test_nlp_pipeline.py
183
183
  tests/test_nonpython_cc_calls.py
184
+ tests/test_orchestrator_cache_mtime.py
184
185
  tests/test_persistent_cache.py
185
186
  tests/test_pipeline_detector.py
186
187
  tests/test_project_toon_export.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2llm"
7
- version = "0.5.140"
7
+ version = "0.5.142"
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"
@@ -0,0 +1,54 @@
1
+ """Regression test: cache-restored export files must have a fresh mtime.
2
+
3
+ Previously `_copy_cached_export` used `shutil.copy2` which preserves the
4
+ original mtime, making users believe the current `code2llm` run did not
5
+ produce any output (the files looked stale). The orchestrator now
6
+ touches every restored file so its mtime reflects the current run.
7
+ """
8
+
9
+ import os
10
+ import time
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+
15
+ from code2llm.cli_exports.orchestrator import _copy_cached_export
16
+
17
+
18
+ def _write(path: Path, content: str, mtime: float) -> None:
19
+ path.parent.mkdir(parents=True, exist_ok=True)
20
+ path.write_text(content, encoding="utf-8")
21
+ os.utime(path, (mtime, mtime))
22
+
23
+
24
+ def test_copy_cached_export_refreshes_mtime(tmp_path: Path) -> None:
25
+ cache_dir = tmp_path / "cache"
26
+ output_dir = tmp_path / "out"
27
+
28
+ old_mtime = time.time() - 60 * 60 * 24 # 24h ago
29
+
30
+ _write(cache_dir / "analysis.toon.yaml", "x: 1\n", old_mtime)
31
+ _write(cache_dir / "sub" / "inner.md", "# hi\n", old_mtime)
32
+
33
+ before = time.time() - 1
34
+ _copy_cached_export(cache_dir, output_dir, verbose=False)
35
+ after = time.time() + 1
36
+
37
+ for rel in ("analysis.toon.yaml", "sub/inner.md"):
38
+ dest = output_dir / rel
39
+ assert dest.exists(), f"missing {rel}"
40
+ mtime = dest.stat().st_mtime
41
+ assert before <= mtime <= after, (
42
+ f"{rel} mtime {mtime} not in current run window "
43
+ f"[{before}, {after}] (old_mtime={old_mtime})"
44
+ )
45
+
46
+
47
+ def test_copy_cached_export_preserves_contents(tmp_path: Path) -> None:
48
+ cache_dir = tmp_path / "cache"
49
+ output_dir = tmp_path / "out"
50
+
51
+ _write(cache_dir / "analysis.toon.yaml", "content: cached\n", time.time() - 10)
52
+ _copy_cached_export(cache_dir, output_dir, verbose=False)
53
+
54
+ assert (output_dir / "analysis.toon.yaml").read_text(encoding="utf-8") == "content: cached\n"
code2llm-0.5.140/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.140
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes