codeboarding 0.13.2__tar.gz → 0.13.3__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.
- {codeboarding-0.13.2/codeboarding.egg-info → codeboarding-0.13.3}/PKG-INFO +3 -3
- {codeboarding-0.13.2 → codeboarding-0.13.3}/PYPI.md +2 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/README.md +4 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/abstraction_agent.py +26 -43
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/agent.py +1 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/agent_responses.py +20 -16
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/cluster_methods_mixin.py +136 -305
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/content_hash.py +22 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/details_agent.py +19 -62
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/file_index_models.py +10 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/incremental_agent.py +198 -27
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/incremental_results.py +3 -0
- codeboarding-0.13.3/agents/planner_agent.py +181 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/__init__.py +0 -9
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/abstract_prompt_factory.py +0 -16
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/claude_prompts.py +19 -170
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/deepseek_prompts.py +22 -169
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/gemini_flash_prompts.py +20 -154
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/glm_prompts.py +21 -178
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/gpt_prompts.py +20 -151
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/kimi_prompts.py +21 -152
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/prompt_factory.py +0 -16
- codeboarding-0.13.3/agents/relation_edges.py +206 -0
- codeboarding-0.13.3/agents/repair.py +101 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/validation.py +0 -212
- {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/__init__.py +1 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/details_cache.py +1 -21
- {codeboarding-0.13.2 → codeboarding-0.13.3/codeboarding.egg-info}/PKG-INFO +3 -3
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/SOURCES.txt +1 -4
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/full_analysis.py +7 -3
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/analysis.py +17 -8
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/__init__.py +5 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/analysis_json.py +52 -5
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/cluster_delta.py +253 -34
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/diagram_generator.py +760 -52
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/exceptions.py +31 -6
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/file_index.py +19 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/io_utils.py +61 -11
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/run_context.py +11 -9
- codeboarding-0.13.3/diagram_analysis/scope_plan.py +267 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/github_action.py +14 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/main.py +3 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/stats.py +13 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/pyproject.toml +6 -15
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/__init__.py +8 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/ignore.py +21 -16
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/__init__.py +1 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/analysis_cache.py +25 -3
- codeboarding-0.13.3/static_analyzer/cluster_helpers.py +577 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/cluster_relations.py +59 -5
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/constants.py +9 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/csharp_adapter.py +4 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/go_adapter.py +25 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/php_adapter.py +32 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/call_graph_builder.py +21 -12
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/edge_builder.py +19 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/language_adapter.py +12 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/lsp_client.py +61 -7
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/models.py +6 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/protocols.py +3 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/result_converter.py +66 -2
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/source_inspector.py +35 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/graph.py +90 -173
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/incremental_orchestrator.py +31 -6
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/language_results.py +6 -1
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_github_action.py +43 -0
- codeboarding-0.13.2/agents/cluster_budget.py +0 -21
- codeboarding-0.13.2/agents/incremental_planning_agent.py +0 -305
- codeboarding-0.13.2/agents/planner_agent.py +0 -117
- codeboarding-0.13.2/agents/relation_edges.py +0 -52
- codeboarding-0.13.2/agents/repair.py +0 -276
- codeboarding-0.13.2/agents/scope_operations.py +0 -35
- codeboarding-0.13.2/static_analyzer/cfg_skip_planner.py +0 -214
- codeboarding-0.13.2/static_analyzer/cluster_helpers.py +0 -511
- {codeboarding-0.13.2 → codeboarding-0.13.3}/LICENSE +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/change_status.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/cluster_ids.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/constants.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/dependency_discovery.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/llm_config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/llm_errors.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/meta_agent.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/model_capabilities.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/retry.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/scope_ids.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/base.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/component_bridge_edges.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/get_external_deps.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/get_method_invocations.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/list_git_changes.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_cfg.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_docs.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_file.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_file_structure.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_packages.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_source.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_structure.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/toolkit.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/cache.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/meta_cache.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/dependency_links.txt +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/entry_points.txt +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/requires.txt +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/top_level.txt +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/bootstrap.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/incremental_analysis.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/partial_analysis.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/view_instructions.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/orchestration.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/rendering.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/local.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/remote.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/constants.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/core/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/core/plugin_loader.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/core/protocols.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/core/registry.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/cluster_snapshot.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/file_coverage.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/run_mode.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/circular_deps.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/cohesion.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/coupling.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/function_size.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/god_class.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/inheritance.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/instability.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/unused_code_diagnostics.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/models.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/health/runner.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/install.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/logging_config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/callbacks.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/context.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/mixin.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/paths.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/writers.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/html.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/html_template.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/markdown.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/mdx.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/sphinx.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/change_detector.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/errors.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/fingerprint_diff.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/git_ops.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/path_utils.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/setup.cfg +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/analysis_result.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/csharp_config_scanner.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/dotnet_sdk.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/java_adapter.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/python_adapter.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/rust_adapter.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/typescript_adapter.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/edge_build_context.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/hierarchy_builder.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/lsp_constants.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/progress.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/symbol_table.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/utils.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/internal_references.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/java_config_scanner.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/java_utils.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/leiden_utils.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/lsp_client/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/lsp_client/diagnostics.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/method_cluster_paths.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/node.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/programming_language.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/reference_resolver.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/scanner.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/typescript_config_scanner.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/device_id.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/events.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/schemas.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/service.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_cli_parser.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_install.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_logging_config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_main.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_pyproject_packages.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_registry_coverage.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_telemetry_events.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_tool_registry.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_user_config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_view_instructions.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_vscode_constants.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_windows_compatibility.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_windows_encoding.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/__init__.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/installers.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/manifest.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/paths.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/registry.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/user_config.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/utils.py +0 -0
- {codeboarding-0.13.2 → codeboarding-0.13.3}/vscode_constants.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codeboarding
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.3
|
|
4
4
|
Summary: Interactive Diagrams for Code
|
|
5
5
|
Author: CodeBoarding Team
|
|
6
6
|
License-Expression: MIT
|
|
@@ -153,7 +153,7 @@ generator = DiagramGenerator(
|
|
|
153
153
|
temp_folder=output_dir,
|
|
154
154
|
repo_name="my-project",
|
|
155
155
|
output_dir=output_dir,
|
|
156
|
-
depth_level=
|
|
156
|
+
depth_level=3, # safety-valve cap; a component that outgrows the leaf ceiling is flagged expandable and can be expanded on demand
|
|
157
157
|
)
|
|
158
158
|
[analysis_path] = generator.generate_analysis()
|
|
159
159
|
|
|
@@ -211,7 +211,7 @@ codeboarding partial --local PATH --component-id ID # update one component
|
|
|
211
211
|
| Option | Description |
|
|
212
212
|
|---|---|
|
|
213
213
|
| `--local PATH` | Analyze a local repository (output: `PATH/.codeboarding/`) |
|
|
214
|
-
| `--depth-level INT` |
|
|
214
|
+
| `--depth-level INT` | Safety-valve depth cap (default: 3) on how deep auto-expansion goes; a component that outgrows the leaf ceiling is flagged expandable regardless, and can be expanded on demand |
|
|
215
215
|
| `--force` | (full only) Force full reanalysis, skip cached static analysis |
|
|
216
216
|
| `--base-ref REF` / `--target-ref REF` | (incremental only) Git refs to diff |
|
|
217
217
|
| `--component-id ID` | (partial only) ID of the component to update |
|
|
@@ -81,7 +81,7 @@ generator = DiagramGenerator(
|
|
|
81
81
|
temp_folder=output_dir,
|
|
82
82
|
repo_name="my-project",
|
|
83
83
|
output_dir=output_dir,
|
|
84
|
-
depth_level=
|
|
84
|
+
depth_level=3, # safety-valve cap; a component that outgrows the leaf ceiling is flagged expandable and can be expanded on demand
|
|
85
85
|
)
|
|
86
86
|
[analysis_path] = generator.generate_analysis()
|
|
87
87
|
|
|
@@ -139,7 +139,7 @@ codeboarding partial --local PATH --component-id ID # update one component
|
|
|
139
139
|
| Option | Description |
|
|
140
140
|
|---|---|
|
|
141
141
|
| `--local PATH` | Analyze a local repository (output: `PATH/.codeboarding/`) |
|
|
142
|
-
| `--depth-level INT` |
|
|
142
|
+
| `--depth-level INT` | Safety-valve depth cap (default: 3) on how deep auto-expansion goes; a component that outgrows the leaf ceiling is flagged expandable regardless, and can be expanded on demand |
|
|
143
143
|
| `--force` | (full only) Force full reanalysis, skip cached static analysis |
|
|
144
144
|
| `--base-ref REF` / `--target-ref REF` | (incremental only) Git refs to diff |
|
|
145
145
|
| `--component-id ID` | (partial only) ID of the component to update |
|
|
@@ -124,8 +124,10 @@ Shell environment variables such as `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOG
|
|
|
124
124
|
# Analyze a local repository
|
|
125
125
|
python main.py full --local ./my-project
|
|
126
126
|
|
|
127
|
-
#
|
|
128
|
-
|
|
127
|
+
# Raise the depth ceiling to auto-expand deeper (rarely needed — a component that
|
|
128
|
+
# outgrows the leaf ceiling is flagged expandable at whatever depth the run stops
|
|
129
|
+
# and can be expanded on demand; --depth-level is a safety-valve cap, default 3)
|
|
130
|
+
python main.py full --local ./my-project --depth-level 5
|
|
129
131
|
|
|
130
132
|
# Re-analyze only changed parts when possible
|
|
131
133
|
python main.py incremental --local ./my-project
|
|
@@ -17,7 +17,6 @@ from agents.agent_responses import (
|
|
|
17
17
|
)
|
|
18
18
|
from agents.cluster_methods_mixin import ClusterMethodsMixin
|
|
19
19
|
from agents.prompts import (
|
|
20
|
-
get_cluster_grouping_message,
|
|
21
20
|
get_final_analysis_message,
|
|
22
21
|
get_api_surfaces_message,
|
|
23
22
|
get_relation_analysis_message,
|
|
@@ -28,17 +27,15 @@ from agents.relation_edges import index_relation_endpoints
|
|
|
28
27
|
from agents.repair import ComponentRepairContext, repair_component_group_names, repair_key_entities
|
|
29
28
|
from agents.validation import (
|
|
30
29
|
ValidationContext,
|
|
31
|
-
validate_cluster_coverage,
|
|
32
30
|
validate_group_name_coverage,
|
|
33
31
|
validate_key_entities,
|
|
34
32
|
validate_relations,
|
|
35
33
|
)
|
|
36
34
|
from monitoring import trace
|
|
35
|
+
from static_analyzer import StaticAnalysisFatalError
|
|
37
36
|
from static_analyzer.analysis_result import StaticAnalysisResults
|
|
38
|
-
from static_analyzer.cluster_helpers import
|
|
39
|
-
|
|
40
|
-
get_all_cluster_ids,
|
|
41
|
-
)
|
|
37
|
+
from static_analyzer.cluster_helpers import build_all_cluster_results
|
|
38
|
+
from static_analyzer.constants import Language
|
|
42
39
|
from static_analyzer.graph import ClusterResult
|
|
43
40
|
|
|
44
41
|
logger = logging.getLogger(__name__)
|
|
@@ -61,10 +58,6 @@ class AbstractionAgent(ClusterMethodsMixin, CodeBoardingAgent):
|
|
|
61
58
|
self.meta_context = meta_context
|
|
62
59
|
|
|
63
60
|
self.prompts = {
|
|
64
|
-
"group_clusters": PromptTemplate(
|
|
65
|
-
template=get_cluster_grouping_message(),
|
|
66
|
-
input_variables=["cfg_clusters"],
|
|
67
|
-
),
|
|
68
61
|
"final_analysis": PromptTemplate(
|
|
69
62
|
template=get_final_analysis_message(),
|
|
70
63
|
input_variables=["cluster_analysis"],
|
|
@@ -88,37 +81,18 @@ class AbstractionAgent(ClusterMethodsMixin, CodeBoardingAgent):
|
|
|
88
81
|
|
|
89
82
|
@trace
|
|
90
83
|
def step_clusters_grouping(self, cluster_results: dict[str, ClusterResult]) -> ClusterAnalysis:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
)
|
|
103
|
-
cluster_str = self._build_cluster_string(
|
|
104
|
-
programming_langs, cluster_results, prompt_overhead_chars=overhead_chars
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
prompt = self.prompts["group_clusters"].format(
|
|
108
|
-
cfg_clusters=cluster_str,
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
cluster_analysis = self._invoke_validate(
|
|
112
|
-
prompt,
|
|
113
|
-
ClusterAnalysis,
|
|
114
|
-
validators=[validate_cluster_coverage],
|
|
115
|
-
validation_context=ValidationContext(
|
|
116
|
-
cluster_results=cluster_results,
|
|
117
|
-
expected_cluster_ids=get_all_cluster_ids(cluster_results),
|
|
118
|
-
),
|
|
119
|
-
max_validation_attempts=3,
|
|
120
|
-
)
|
|
121
|
-
return cluster_analysis
|
|
84
|
+
"""Deterministically partition leaf clusters into the top-level component groups.
|
|
85
|
+
|
|
86
|
+
Resolution-tuned Leiden picks both the count (modularity peak over
|
|
87
|
+
``[5, 8]``) and the membership, so the top-level structure is stable across
|
|
88
|
+
re-runs — the LLM no longer decides it; it only names them in the
|
|
89
|
+
final-analysis step.
|
|
90
|
+
"""
|
|
91
|
+
logger.info(f"[AbstractionAgent] Super-clustering leaf clusters for: {self.project_name}")
|
|
92
|
+
cfg_graphs = {
|
|
93
|
+
lang: self.static_analysis.get_cfg(Language(lang)).clustering_networkx() for lang in cluster_results
|
|
94
|
+
}
|
|
95
|
+
return self.deterministic_cluster_grouping(cluster_results, cfg_graphs)
|
|
122
96
|
|
|
123
97
|
@trace
|
|
124
98
|
def step_final_analysis(
|
|
@@ -162,6 +136,7 @@ class AbstractionAgent(ClusterMethodsMixin, CodeBoardingAgent):
|
|
|
162
136
|
validation_context=context,
|
|
163
137
|
max_validation_attempts=3,
|
|
164
138
|
)
|
|
139
|
+
self.assemble_one_component_per_group(architecture, llm_cluster_analysis, cluster_results)
|
|
165
140
|
return AnalysisInsights(
|
|
166
141
|
description=architecture.description,
|
|
167
142
|
components=architecture.components,
|
|
@@ -219,10 +194,18 @@ class AbstractionAgent(ClusterMethodsMixin, CodeBoardingAgent):
|
|
|
219
194
|
# Build full cluster results dict for all languages ONCE
|
|
220
195
|
cluster_results = build_all_cluster_results(self.static_analysis)
|
|
221
196
|
|
|
222
|
-
# Step 1:
|
|
197
|
+
# Step 1: Deterministically partition leaf clusters into the top-level groups (Leiden, modularity-peak N)
|
|
223
198
|
cluster_analysis = self.step_clusters_grouping(cluster_results)
|
|
199
|
+
if not cluster_analysis.cluster_components:
|
|
200
|
+
# No leaf clusters means the repo has no callable structure to abstract
|
|
201
|
+
# (unsupported/empty/no-code). Fail loudly instead of emptying the
|
|
202
|
+
# architecture and crashing downstream in populate_file_methods.
|
|
203
|
+
raise StaticAnalysisFatalError(
|
|
204
|
+
f"No component groups found for {self.project_name}: the static analysis produced "
|
|
205
|
+
"no callable structure to build an architecture from."
|
|
206
|
+
)
|
|
224
207
|
|
|
225
|
-
# Step 2:
|
|
208
|
+
# Step 2: Name and describe each fixed group into a component (LLM, one component per group)
|
|
226
209
|
analysis = self.step_final_analysis(cluster_analysis, cluster_results)
|
|
227
210
|
# Step 3: Assign hierarchical component IDs ("1", "2", "3", ...)
|
|
228
211
|
assign_component_ids(analysis)
|
|
@@ -7,7 +7,7 @@ from typing import Protocol, TypeVar
|
|
|
7
7
|
from google.api_core.exceptions import ResourceExhausted
|
|
8
8
|
from langchain_core.exceptions import OutputParserException
|
|
9
9
|
from langchain_core.language_models import BaseChatModel
|
|
10
|
-
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
|
|
10
|
+
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
|
|
11
11
|
from langchain_core.output_parsers import PydanticOutputParser
|
|
12
12
|
from langchain_core.prompts import PromptTemplate
|
|
13
13
|
from langchain.agents import create_agent
|
|
@@ -6,13 +6,13 @@ from abc import abstractmethod
|
|
|
6
6
|
from collections.abc import Hashable
|
|
7
7
|
from enum import StrEnum
|
|
8
8
|
from pathlib import PurePosixPath
|
|
9
|
-
from typing import TYPE_CHECKING, get_origin
|
|
9
|
+
from typing import TYPE_CHECKING, get_origin
|
|
10
10
|
|
|
11
11
|
from pydantic import BaseModel, Field
|
|
12
12
|
from pydantic.fields import FieldInfo
|
|
13
13
|
|
|
14
14
|
from agents.cluster_ids import CodeBoardingClusterId, GraphClusterId
|
|
15
|
-
from agents.file_index_models import FileEntry, FileMethodGroup
|
|
15
|
+
from agents.file_index_models import FileEntry, FileMethodGroup
|
|
16
16
|
from agents.scope_ids import ROOT_SCOPE_ID
|
|
17
17
|
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
@@ -644,7 +644,14 @@ def assign_component_ids(analysis: AnalysisInsights, parent_id: str = "", only_n
|
|
|
644
644
|
|
|
645
645
|
|
|
646
646
|
def assign_relation_ids(analysis: AnalysisInsights) -> None:
|
|
647
|
-
"""Assign relation component IDs by
|
|
647
|
+
"""Assign relation component IDs by name, dropping any relation whose endpoint
|
|
648
|
+
does not name a component in this scope.
|
|
649
|
+
|
|
650
|
+
Relation generation can emit an endpoint that is not a sibling — a name from a
|
|
651
|
+
neighbouring scope, or one the wording invented. Such a relation has no valid id and
|
|
652
|
+
would render as a dangling edge (``relations.endpoints_resolve``), so it is removed
|
|
653
|
+
rather than kept with an empty endpoint id.
|
|
654
|
+
"""
|
|
648
655
|
name_to_id: dict[str, str] = {}
|
|
649
656
|
for c in analysis.components:
|
|
650
657
|
if c.name in name_to_id:
|
|
@@ -654,9 +661,17 @@ def assign_relation_ids(analysis: AnalysisInsights) -> None:
|
|
|
654
661
|
)
|
|
655
662
|
else:
|
|
656
663
|
name_to_id[c.name] = c.component_id
|
|
664
|
+
resolved: list[Relation] = []
|
|
657
665
|
for relation in analysis.components_relations:
|
|
658
|
-
|
|
659
|
-
|
|
666
|
+
src_id = name_to_id.get(relation.src_name, "")
|
|
667
|
+
dst_id = name_to_id.get(relation.dst_name, "")
|
|
668
|
+
if not src_id or not dst_id:
|
|
669
|
+
logger.info(f"Dropping relation with unresolved endpoint: '{relation.src_name}' -> '{relation.dst_name}'")
|
|
670
|
+
continue
|
|
671
|
+
relation.src_id = src_id
|
|
672
|
+
relation.dst_id = dst_id
|
|
673
|
+
resolved.append(relation)
|
|
674
|
+
analysis.components_relations = resolved
|
|
660
675
|
|
|
661
676
|
|
|
662
677
|
def iter_components(
|
|
@@ -805,17 +820,6 @@ class ComponentFiles(LLMBaseModel):
|
|
|
805
820
|
return title + body
|
|
806
821
|
|
|
807
822
|
|
|
808
|
-
class ScopeRelations(LLMBaseModel):
|
|
809
|
-
"""Relations between components within a single scope."""
|
|
810
|
-
|
|
811
|
-
components_relations: list[Relation] = Field(description="Inter-component relationships within this scope.")
|
|
812
|
-
|
|
813
|
-
def llm_str(self):
|
|
814
|
-
if not self.components_relations:
|
|
815
|
-
return "No relations found."
|
|
816
|
-
return "\n".join(r.llm_str() for r in self.components_relations)
|
|
817
|
-
|
|
818
|
-
|
|
819
823
|
class ScopeOperationAction(StrEnum):
|
|
820
824
|
CREATE_COMPONENT = "create_component"
|
|
821
825
|
UPDATE_COMPONENT = "update_component"
|