code2llm 0.5.146__tar.gz → 0.5.148__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.
- {code2llm-0.5.146/code2llm.egg-info → code2llm-0.5.148}/PKG-INFO +10 -9
- {code2llm-0.5.146 → code2llm-0.5.148}/README.md +9 -8
- code2llm-0.5.148/VERSION +1 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/__init__.py +1 -1
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/smells.py +11 -7
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/refactoring.py +3 -2
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution/computation.py +32 -13
- code2llm-0.5.148/code2llm/exporters/evolution/exclusion.py +17 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/flow_constants.py +5 -7
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/utils.py +3 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/flow_compact.py +17 -3
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/helpers.py +1 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/__init__.py +1 -1
- {code2llm-0.5.146 → code2llm-0.5.148/code2llm.egg-info}/PKG-INFO +10 -9
- {code2llm-0.5.146 → code2llm-0.5.148}/pyproject.toml +1 -1
- code2llm-0.5.146/VERSION +0 -1
- code2llm-0.5.146/code2llm/exporters/evolution/exclusion.py +0 -17
- {code2llm-0.5.146 → code2llm-0.5.148}/LICENSE +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/MANIFEST.in +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/__main__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/call_graph.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/cfg.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/coupling.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/data_analysis.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/dfg.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/pipeline_classifier.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/pipeline_detector.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/pipeline_resolver.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/side_effects.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/type_inference.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/utils/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/analysis/utils/ast_helpers.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/api.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_analysis.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_commands.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/code2logic.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/formats.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/orchestrator.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/orchestrator_chunked.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/orchestrator_constants.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/orchestrator_handlers.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_exports/prompt.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/cli_parser.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/analyzer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/ast_registry.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/config.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/export_pipeline.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/file_analyzer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/file_cache.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/file_filter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/gitignore.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/incremental.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/base.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/cpp.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/csharp.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/generic.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/go_lang.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/java.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/php.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/ruby.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/rust.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/ts_extractors.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/ts_parser.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/lang/typescript.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/large_repo.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/models.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/persistent_cache.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/repo_files.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/cache.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/incremental.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/prioritizer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/scanner.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming/strategies.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/streaming_analyzer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/core/toon_size_manager.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/article_view.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/base.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/context_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/context_view.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/dashboard_data.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/dashboard_renderer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution/constants.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution/render.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution/yaml_export.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/evolution_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/flow_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/flow_renderer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/html_dashboard.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/index_generator/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/index_generator/renderer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/index_generator/scanner.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/index_generator.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/json_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/llm_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/alerts.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/details.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/header.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/module_list.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map/yaml_export.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/map_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/calls.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/classic.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/compact.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/flow_detailed.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/flow_full.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid/utils.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/mermaid_flow_helpers.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/constants.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/core.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/evolution.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/health.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/hotspots.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml/modules.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/project_yaml_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme/content.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme/files.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme/insights.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme/sections.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/readme_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/report_generators.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/metrics.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/metrics_core.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/metrics_duplicates.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/metrics_health.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/module_detail.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon/renderer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/toon_view.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/validate_project.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/exporters/yaml_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/_utils.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/analysis.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/cli.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/generator.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/nodes.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/parsing.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow/utils.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_flow.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/llm_task.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/mermaid/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/mermaid/fix.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/mermaid/png.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/mermaid/validation.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/generators/mermaid.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/config.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/entity_resolution.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/intent_matching.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/normalization.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/nlp/pipeline.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/parsers/toon_parser.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/patterns/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/patterns/detector.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/refactor/__init__.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm/refactor/prompt_engine.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm.egg-info/SOURCES.txt +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm.egg-info/dependency_links.txt +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm.egg-info/entry_points.txt +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm.egg-info/requires.txt +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/code2llm.egg-info/top_level.txt +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/setup.cfg +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/setup.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_advanced_analysis.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_analyzer.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_cache_invalidation_e2e.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_calls_toon_export.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_declarative_collection.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_deep_analysis.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_edge_cases.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_file_analyzer_tagging.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_flow_exporter.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_format_quality.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_multilanguage_e2e.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_nlp_pipeline.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_nonpython_cc_calls.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_orchestrator_cache_mtime.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_persistent_cache.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_pipeline_detector.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_project_toon_export.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_prompt_engine.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_prompt_txt.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/tests/test_refactoring_engine.py +0 -0
- {code2llm-0.5.146 → code2llm-0.5.148}/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.
|
|
3
|
+
Version: 0.5.148
|
|
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
|
|
@@ -64,19 +64,20 @@ Dynamic: requires-python
|
|
|
64
64
|
|
|
65
65
|
# code2llm - Generated Analysis Files
|
|
66
66
|
|
|
67
|
-
|
|
68
67
|
## AI Cost Tracking
|
|
69
68
|
|
|
70
|
-
     
|
|
70
|
+
  
|
|
72
71
|
|
|
73
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
74
|
-
- 👤 **Human dev:** ~$
|
|
72
|
+
- 🤖 **LLM usage:** $7.5000 (200 commits)
|
|
73
|
+
- 👤 **Human dev:** ~$7319 (73.2h @ $100/h, 30min dedup)
|
|
75
74
|
|
|
76
75
|
Generated on 2026-05-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
77
76
|
|
|
78
77
|
---
|
|
79
78
|
|
|
79
|
+
<!-- generated in 0.00s -->
|
|
80
|
+
|
|
80
81
|
This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
|
|
81
82
|
|
|
82
83
|
## 📁 Generated Files Overview
|
|
@@ -406,9 +407,9 @@ code2llm ./ -f yaml --separate-orphans
|
|
|
406
407
|
|
|
407
408
|
**Generated by**: `code2llm ./ -f all --readme`
|
|
408
409
|
**Analysis Date**: 2026-05-06
|
|
409
|
-
**Total Functions**:
|
|
410
|
-
**Total Classes**:
|
|
411
|
-
**Modules**:
|
|
410
|
+
**Total Functions**: 3800
|
|
411
|
+
**Total Classes**: 259
|
|
412
|
+
**Modules**: 497
|
|
412
413
|
|
|
413
414
|
For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
|
|
414
415
|
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
# code2llm - Generated Analysis Files
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
## AI Cost Tracking
|
|
5
4
|
|
|
6
|
-
     
|
|
6
|
+
  
|
|
8
7
|
|
|
9
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
10
|
-
- 👤 **Human dev:** ~$
|
|
8
|
+
- 🤖 **LLM usage:** $7.5000 (200 commits)
|
|
9
|
+
- 👤 **Human dev:** ~$7319 (73.2h @ $100/h, 30min dedup)
|
|
11
10
|
|
|
12
11
|
Generated on 2026-05-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
13
12
|
|
|
14
13
|
---
|
|
15
14
|
|
|
15
|
+
<!-- generated in 0.00s -->
|
|
16
|
+
|
|
16
17
|
This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
|
|
17
18
|
|
|
18
19
|
## 📁 Generated Files Overview
|
|
@@ -342,9 +343,9 @@ code2llm ./ -f yaml --separate-orphans
|
|
|
342
343
|
|
|
343
344
|
**Generated by**: `code2llm ./ -f all --readme`
|
|
344
345
|
**Analysis Date**: 2026-05-06
|
|
345
|
-
**Total Functions**:
|
|
346
|
-
**Total Classes**:
|
|
347
|
-
**Modules**:
|
|
346
|
+
**Total Functions**: 3800
|
|
347
|
+
**Total Classes**: 259
|
|
348
|
+
**Modules**: 497
|
|
348
349
|
|
|
349
350
|
For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
|
|
350
351
|
|
code2llm-0.5.148/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.5.148
|
|
@@ -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.
|
|
11
|
+
__version__ = "0.5.148"
|
|
12
12
|
__author__ = "STTS Project"
|
|
13
13
|
|
|
14
14
|
# Core analysis components (lightweight, always needed)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Detection of code smells using analysis metrics."""
|
|
2
|
+
from collections import defaultdict
|
|
2
3
|
from typing import List, Dict, Any
|
|
3
4
|
from code2llm.core.models import AnalysisResult, CodeSmell
|
|
4
5
|
|
|
@@ -7,6 +8,10 @@ class SmellDetector:
|
|
|
7
8
|
|
|
8
9
|
def __init__(self, result: AnalysisResult):
|
|
9
10
|
self.result = result
|
|
11
|
+
# Pre-index mutations by scope — avoids O(n×m) full scans
|
|
12
|
+
self._mutations_by_scope: Dict[str, list] = defaultdict(list)
|
|
13
|
+
for m in result.mutations:
|
|
14
|
+
self._mutations_by_scope[m.scope].append(m)
|
|
10
15
|
|
|
11
16
|
def detect(self) -> List[CodeSmell]:
|
|
12
17
|
"""Record and return detected code smells."""
|
|
@@ -28,7 +33,7 @@ class SmellDetector:
|
|
|
28
33
|
for func_name, func_info in self.result.functions.items():
|
|
29
34
|
metrics = self.result.metrics.get(func_name, {})
|
|
30
35
|
fan_out = metrics.get('fan_out', 0)
|
|
31
|
-
mutation_count = len(
|
|
36
|
+
mutation_count = len(self._mutations_by_scope.get(func_name, []))
|
|
32
37
|
|
|
33
38
|
# Use cyclomatic complexity (now mapped to 'cc' in FunctionInfo.complexity)
|
|
34
39
|
complexity = func_info.complexity.get('cyclomatic_complexity', 1)
|
|
@@ -78,12 +83,11 @@ class SmellDetector:
|
|
|
78
83
|
mut_mod = func_name.split('.')[0]
|
|
79
84
|
foreign_mutations = []
|
|
80
85
|
|
|
81
|
-
for mutation in self.
|
|
82
|
-
if
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
foreign_mutations.append(mutation.variable)
|
|
86
|
+
for mutation in self._mutations_by_scope.get(func_name, []):
|
|
87
|
+
if '.' in mutation.variable:
|
|
88
|
+
origin_mod = mutation.variable.split('.')[0]
|
|
89
|
+
if origin_mod != mut_mod:
|
|
90
|
+
foreign_mutations.append(mutation.variable)
|
|
87
91
|
|
|
88
92
|
if len(set(foreign_mutations)) >= 3:
|
|
89
93
|
smells.append(CodeSmell(
|
|
@@ -82,8 +82,9 @@ class RefactoringAnalyzer:
|
|
|
82
82
|
if node_count > 500:
|
|
83
83
|
if self.config.verbose:
|
|
84
84
|
print(f" Large graph ({node_count} nodes), using sampled centrality...")
|
|
85
|
-
# Sample 20%
|
|
86
|
-
|
|
85
|
+
# Sample adaptively: 10% for large, 20% for medium, cap at 200
|
|
86
|
+
ratio = 0.1 if node_count > 2000 else 0.2
|
|
87
|
+
k = min(int(node_count * ratio), 200)
|
|
87
88
|
import networkx as nx
|
|
88
89
|
centrality = nx.betweenness_centrality(call_graph, k=k)
|
|
89
90
|
else:
|
|
@@ -29,21 +29,40 @@ def compute_func_data(result: AnalysisResult) -> List[Dict]:
|
|
|
29
29
|
return sorted(func_data, key=lambda x: x["impact"], reverse=True)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
def scan_file_sizes(project_path: Optional[Path]) -> Dict[str, int]:
|
|
33
|
-
"""
|
|
32
|
+
def scan_file_sizes(project_path: Optional[Path], result: Optional[AnalysisResult] = None) -> Dict[str, int]:
|
|
33
|
+
"""Return per-file line counts, preferring already-analyzed module data."""
|
|
34
34
|
file_lines: Dict[str, int] = {}
|
|
35
|
+
|
|
36
|
+
# Fast path: derive from AnalysisResult modules (no I/O)
|
|
37
|
+
if result and result.modules:
|
|
38
|
+
for mi in result.modules.values():
|
|
39
|
+
if mi.file and not is_excluded(mi.file):
|
|
40
|
+
lc = mi.line_count if hasattr(mi, 'line_count') and mi.line_count else 0
|
|
41
|
+
if lc == 0:
|
|
42
|
+
lc = len(mi.functions) + len(mi.classes)
|
|
43
|
+
if lc > 0:
|
|
44
|
+
file_lines[mi.file] = lc
|
|
45
|
+
if file_lines:
|
|
46
|
+
return file_lines
|
|
47
|
+
|
|
48
|
+
# Slow fallback: single os.walk (only if result is unavailable)
|
|
35
49
|
if not project_path or not project_path.is_dir():
|
|
36
50
|
return file_lines
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
|
|
52
|
+
import os
|
|
53
|
+
exclude = {'.git', '__pycache__', 'node_modules', 'venv', '.venv',
|
|
54
|
+
'env', '.env', 'site-packages', 'dist', 'build', '.tox'}
|
|
55
|
+
for dirpath, dirnames, filenames in os.walk(str(project_path)):
|
|
56
|
+
dirnames[:] = [d for d in dirnames if d not in exclude]
|
|
57
|
+
for fn in filenames:
|
|
58
|
+
if not fn.endswith('.py'):
|
|
59
|
+
continue
|
|
60
|
+
fpath = os.path.join(dirpath, fn)
|
|
61
|
+
try:
|
|
62
|
+
with open(fpath, encoding='utf-8', errors='ignore') as f:
|
|
63
|
+
file_lines[fpath] = sum(1 for _ in f)
|
|
64
|
+
except Exception:
|
|
65
|
+
pass
|
|
47
66
|
return file_lines
|
|
48
67
|
|
|
49
68
|
|
|
@@ -109,7 +128,7 @@ def compute_god_modules(result: AnalysisResult) -> List[Dict]:
|
|
|
109
128
|
"""Identify god modules (≥500 lines) from project files."""
|
|
110
129
|
pp = Path(result.project_path) if result.project_path else None
|
|
111
130
|
|
|
112
|
-
file_lines = scan_file_sizes(pp)
|
|
131
|
+
file_lines = scan_file_sizes(pp, result)
|
|
113
132
|
file_stats = aggregate_file_stats(result, file_lines)
|
|
114
133
|
return filter_god_modules(file_stats, pp)
|
|
115
134
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Evolution exporter exclusion logic — path filtering."""
|
|
2
|
+
|
|
3
|
+
from functools import lru_cache
|
|
4
|
+
|
|
5
|
+
from .constants import EXCLUDE_PATTERNS
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@lru_cache(maxsize=4096)
|
|
9
|
+
def is_excluded(path: str) -> bool:
|
|
10
|
+
"""Check if path should be excluded (venv, site-packages, etc.)."""
|
|
11
|
+
if not path:
|
|
12
|
+
return False
|
|
13
|
+
parts = set(path.lower().replace('\\', '/').split('/'))
|
|
14
|
+
return bool(parts & EXCLUDE_PATTERNS)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = ['is_excluded']
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
Zawiera progi, wzorce wykluczeń i rekomendacje dotyczące podziału typów hub.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
from functools import lru_cache
|
|
7
|
+
|
|
6
8
|
# Progi dla wykrywania problemów
|
|
7
9
|
CC_HIGH = 15
|
|
8
10
|
FAN_OUT_THRESHOLD = 10
|
|
@@ -19,17 +21,13 @@ EXCLUDE_PATTERNS = {
|
|
|
19
21
|
'virtualenv', '.virtualenv', 'envs', '.envs',
|
|
20
22
|
}
|
|
21
23
|
|
|
24
|
+
@lru_cache(maxsize=4096)
|
|
22
25
|
def is_excluded_path(path: str) -> bool:
|
|
23
26
|
"""Return True if *path* matches any standard exclusion pattern (venv, cache, etc.)."""
|
|
24
27
|
if not path:
|
|
25
28
|
return False
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if f'/{pattern}/' in path_lower or path_lower.startswith(f'{pattern}/'):
|
|
29
|
-
return True
|
|
30
|
-
if pattern in path_lower.split('/'):
|
|
31
|
-
return True
|
|
32
|
-
return False
|
|
29
|
+
parts = set(path.lower().replace('\\', '/').split('/'))
|
|
30
|
+
return bool(parts & EXCLUDE_PATTERNS)
|
|
33
31
|
|
|
34
32
|
|
|
35
33
|
# Rekomendacje podziału typów hub: typ -> sugerowane pod-interfejsy
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Map exporter utilities — path handling, line counting, language detection."""
|
|
2
2
|
|
|
3
|
+
from functools import lru_cache
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
from typing import Dict, Set
|
|
5
6
|
from collections import defaultdict
|
|
@@ -8,6 +9,7 @@ from code2llm.core.config import LANGUAGE_EXTENSIONS
|
|
|
8
9
|
from code2llm.core.models import AnalysisResult
|
|
9
10
|
|
|
10
11
|
|
|
12
|
+
@lru_cache(maxsize=4096)
|
|
11
13
|
def rel_path(fpath: str, project_path: str) -> str:
|
|
12
14
|
"""Get relative path from project root."""
|
|
13
15
|
if not project_path or not fpath:
|
|
@@ -21,6 +23,7 @@ def rel_path(fpath: str, project_path: str) -> str:
|
|
|
21
23
|
return fpath
|
|
22
24
|
|
|
23
25
|
|
|
26
|
+
@lru_cache(maxsize=4096)
|
|
24
27
|
def file_line_count(fpath: str) -> int:
|
|
25
28
|
"""Count lines in a file."""
|
|
26
29
|
try:
|
|
@@ -21,6 +21,21 @@ def should_skip_module(module: str, include_examples: bool = False) -> bool:
|
|
|
21
21
|
return any(pat in mod_lower for pat in SKIP_PATTERNS)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
# Pre-computed set of functions that have at least one incoming call
|
|
25
|
+
_called_funcs_cache: Dict[int, Set[str]] = {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get_called_funcs(result: AnalysisResult) -> Set[str]:
|
|
29
|
+
"""Build (and cache) the set of all functions called by other functions."""
|
|
30
|
+
rid = id(result)
|
|
31
|
+
if rid not in _called_funcs_cache:
|
|
32
|
+
called: Set[str] = set()
|
|
33
|
+
for fi in result.functions.values():
|
|
34
|
+
called.update(fi.calls)
|
|
35
|
+
_called_funcs_cache[rid] = called
|
|
36
|
+
return _called_funcs_cache[rid]
|
|
37
|
+
|
|
38
|
+
|
|
24
39
|
def is_entry_point(func_name: str, fi, result: AnalysisResult) -> bool:
|
|
25
40
|
"""Detect if function is an entry point (main, cli, api entry)."""
|
|
26
41
|
name = fi.name
|
|
@@ -36,9 +51,8 @@ def is_entry_point(func_name: str, fi, result: AnalysisResult) -> bool:
|
|
|
36
51
|
if func_name.startswith('code2llm.api.'):
|
|
37
52
|
return True
|
|
38
53
|
# Entry points have no incoming calls from within the project
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if not has_incoming and name not in ('__init__', '__getattr__'):
|
|
54
|
+
called_funcs = _get_called_funcs(result)
|
|
55
|
+
if func_name not in called_funcs and name not in ('__init__', '__getattr__'):
|
|
42
56
|
return True
|
|
43
57
|
return False
|
|
44
58
|
|
|
@@ -10,6 +10,7 @@ from code2llm.core.models import AnalysisResult, FunctionInfo
|
|
|
10
10
|
from ..flow_constants import is_excluded_path as _is_excluded
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
@lru_cache(maxsize=4096)
|
|
13
14
|
def _rel_path(fpath: str, project_path: str) -> str:
|
|
14
15
|
if not project_path or not fpath:
|
|
15
16
|
return fpath or ""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code2llm
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.148
|
|
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
|
|
@@ -64,19 +64,20 @@ Dynamic: requires-python
|
|
|
64
64
|
|
|
65
65
|
# code2llm - Generated Analysis Files
|
|
66
66
|
|
|
67
|
-
|
|
68
67
|
## AI Cost Tracking
|
|
69
68
|
|
|
70
|
-
     
|
|
70
|
+
  
|
|
72
71
|
|
|
73
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
74
|
-
- 👤 **Human dev:** ~$
|
|
72
|
+
- 🤖 **LLM usage:** $7.5000 (200 commits)
|
|
73
|
+
- 👤 **Human dev:** ~$7319 (73.2h @ $100/h, 30min dedup)
|
|
75
74
|
|
|
76
75
|
Generated on 2026-05-06 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
77
76
|
|
|
78
77
|
---
|
|
79
78
|
|
|
79
|
+
<!-- generated in 0.00s -->
|
|
80
|
+
|
|
80
81
|
This directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase.
|
|
81
82
|
|
|
82
83
|
## 📁 Generated Files Overview
|
|
@@ -406,9 +407,9 @@ code2llm ./ -f yaml --separate-orphans
|
|
|
406
407
|
|
|
407
408
|
**Generated by**: `code2llm ./ -f all --readme`
|
|
408
409
|
**Analysis Date**: 2026-05-06
|
|
409
|
-
**Total Functions**:
|
|
410
|
-
**Total Classes**:
|
|
411
|
-
**Modules**:
|
|
410
|
+
**Total Functions**: 3800
|
|
411
|
+
**Total Classes**: 259
|
|
412
|
+
**Modules**: 497
|
|
412
413
|
|
|
413
414
|
For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm
|
|
414
415
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code2llm"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.148"
|
|
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.146/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.5.146
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"""Evolution exporter exclusion logic — path filtering."""
|
|
2
|
-
|
|
3
|
-
from .constants import EXCLUDE_PATTERNS
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def is_excluded(path: str) -> bool:
|
|
7
|
-
"""Check if path should be excluded (venv, site-packages, etc.)."""
|
|
8
|
-
path_lower = path.lower().replace('\\', '/')
|
|
9
|
-
for pattern in EXCLUDE_PATTERNS:
|
|
10
|
-
if f'/{pattern}/' in path_lower or path_lower.startswith(f'{pattern}/'):
|
|
11
|
-
return True
|
|
12
|
-
if pattern in path_lower.split('/'):
|
|
13
|
-
return True
|
|
14
|
-
return False
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
__all__ = ['is_excluded']
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|