codeboarding 0.11.0__tar.gz → 0.12.2__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.11.0/codeboarding.egg-info → codeboarding-0.12.2}/PKG-INFO +8 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/PYPI.md +4 -2
- {codeboarding-0.11.0 → codeboarding-0.12.2}/README.md +25 -8
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/agent.py +72 -51
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/agent_responses.py +186 -32
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/cluster_methods_mixin.py +80 -13
- codeboarding-0.12.2/agents/incremental_agent.py +787 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/llm_config.py +141 -45
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/model_capabilities.py +6 -2
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/__init__.py +4 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/abstract_prompt_factory.py +2 -2
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/claude_prompts.py +82 -62
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/deepseek_prompts.py +66 -42
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/gemini_flash_prompts.py +53 -54
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/glm_prompts.py +69 -36
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/gpt_prompts.py +57 -54
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/kimi_prompts.py +60 -50
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/prompt_factory.py +4 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/validation.py +66 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2/codeboarding.egg-info}/PKG-INFO +8 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/SOURCES.txt +14 -15
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/requires.txt +3 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/top_level.txt +1 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/full_analysis.py +9 -0
- codeboarding-0.12.2/codeboarding_cli/commands/incremental_analysis.py +139 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/partial_analysis.py +0 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/__init__.py +4 -3
- codeboarding-0.12.2/codeboarding_workflows/analysis.py +239 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/core/__init__.py +2 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/core/protocols.py +2 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/analysis_json.py +6 -1
- codeboarding-0.12.2/diagram_analysis/cluster_delta.py +455 -0
- codeboarding-0.12.2/diagram_analysis/cluster_snapshot.py +101 -0
- codeboarding-0.12.2/diagram_analysis/diagram_generator.py +744 -0
- codeboarding-0.12.2/diagram_analysis/exceptions.py +43 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/io_utils.py +143 -33
- codeboarding-0.12.2/diagram_analysis/run_mode.py +10 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/github_action.py +3 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/cohesion.py +6 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/runner.py +9 -3
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health_main.py +2 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/main.py +2 -6
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/paths.py +4 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/pyproject.toml +5 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/change_detector.py +4 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/diff_parser.py +16 -3
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/git_ops.py +79 -43
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/ignore.py +33 -0
- codeboarding-0.12.2/static_analyzer/__init__.py +802 -0
- codeboarding-0.12.2/static_analyzer/analysis_cache.py +475 -0
- codeboarding-0.12.2/static_analyzer/analysis_result.py +273 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cfg_skip_planner.py +7 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cluster_helpers.py +52 -30
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/constants.py +2 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/csharp_config_scanner.py +14 -7
- codeboarding-0.12.2/static_analyzer/dotnet_sdk.py +327 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/csharp_adapter.py +75 -29
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/go_adapter.py +1 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/language_adapter.py +6 -1
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/lsp_client.py +15 -8
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/graph.py +110 -22
- codeboarding-0.12.2/static_analyzer/incremental_orchestrator.py +125 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/java_utils.py +8 -10
- codeboarding-0.12.2/static_analyzer/language_results.py +128 -0
- codeboarding-0.12.2/static_analyzer/leiden_utils.py +103 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/reference_resolve_mixin.py +8 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/scanner.py +2 -0
- codeboarding-0.12.2/static_analyzer/typescript_config_scanner.py +235 -0
- codeboarding-0.12.2/telemetry/__init__.py +10 -0
- codeboarding-0.12.2/telemetry/device_id.py +91 -0
- codeboarding-0.12.2/telemetry/events.py +246 -0
- codeboarding-0.12.2/telemetry/schemas.py +67 -0
- codeboarding-0.12.2/telemetry/service.py +97 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_github_action.py +18 -6
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_main.py +89 -16
- codeboarding-0.12.2/tests/test_telemetry_events.py +196 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_tool_registry.py +93 -8
- codeboarding-0.12.2/tests/test_user_config.py +220 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/__init__.py +1 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/installers.py +79 -4
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/manifest.py +8 -8
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/paths.py +13 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/registry.py +5 -7
- {codeboarding-0.11.0 → codeboarding-0.12.2}/user_config.py +33 -7
- {codeboarding-0.11.0 → codeboarding-0.12.2}/utils.py +17 -0
- codeboarding-0.11.0/agents/analysis_patcher.py +0 -206
- codeboarding-0.11.0/codeboarding_cli/commands/incremental_analysis.py +0 -137
- codeboarding-0.11.0/codeboarding_workflows/analysis.py +0 -144
- codeboarding-0.11.0/diagram_analysis/diagram_generator.py +0 -679
- codeboarding-0.11.0/diagram_analysis/ease.py +0 -68
- codeboarding-0.11.0/diagram_analysis/incremental/delta.py +0 -84
- codeboarding-0.11.0/diagram_analysis/incremental/models.py +0 -220
- codeboarding-0.11.0/diagram_analysis/incremental/payload.py +0 -129
- codeboarding-0.11.0/diagram_analysis/incremental/pipeline.py +0 -264
- codeboarding-0.11.0/diagram_analysis/incremental/semantic_diff.py +0 -557
- codeboarding-0.11.0/diagram_analysis/incremental/trace_planner.py +0 -435
- codeboarding-0.11.0/diagram_analysis/incremental/tracer.py +0 -458
- codeboarding-0.11.0/diagram_analysis/incremental/updater.py +0 -460
- codeboarding-0.11.0/diagram_analysis/run_metadata.py +0 -146
- codeboarding-0.11.0/duckdb_crud.py +0 -125
- codeboarding-0.11.0/health/constants.py +0 -19
- codeboarding-0.11.0/output_generators/__init__.py +0 -0
- codeboarding-0.11.0/static_analyzer/__init__.py +0 -684
- codeboarding-0.11.0/static_analyzer/analysis_cache.py +0 -761
- codeboarding-0.11.0/static_analyzer/analysis_result.py +0 -488
- codeboarding-0.11.0/static_analyzer/cluster_change_analyzer.py +0 -391
- codeboarding-0.11.0/static_analyzer/incremental_orchestrator.py +0 -644
- codeboarding-0.11.0/static_analyzer/typescript_config_scanner.py +0 -54
- codeboarding-0.11.0/tests/test_user_config.py +0 -98
- {codeboarding-0.11.0 → codeboarding-0.12.2}/LICENSE +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/abstraction_agent.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/change_status.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/cluster_budget.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/constants.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/dependency_discovery.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/details_agent.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/meta_agent.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/planner_agent.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/retry.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/base.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/get_external_deps.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/get_method_invocations.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_cfg.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_docs.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_file.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_file_structure.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_packages.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_source.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_structure.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/toolkit.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/cache.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/details_cache.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/meta_cache.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/dependency_links.txt +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/entry_points.txt +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/bootstrap.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/orchestration.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/rendering.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/local.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/remote.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/constants.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/core/plugin_loader.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/core/registry.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/file_coverage.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/run_context.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/version.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/circular_deps.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/coupling.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/function_size.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/god_class.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/inheritance.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/instability.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/unused_code_diagnostics.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/config.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/health/models.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/install.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/logging_config.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/callbacks.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/context.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/mixin.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/stats.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/writers.py +0 -0
- {codeboarding-0.11.0/diagram_analysis/incremental → codeboarding-0.12.2/output_generators}/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/html.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/html_template.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/markdown.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/mdx.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/sphinx.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/errors.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/setup.cfg +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cluster_relations.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/java_adapter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/php_adapter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/python_adapter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/rust_adapter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/typescript_adapter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/call_graph_builder.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/edge_build_context.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/edge_builder.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/hierarchy_builder.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/lsp_constants.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/models.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/progress.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/protocols.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/result_converter.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/source_inspector.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/symbol_table.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/utils.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/java_config_scanner.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/lsp_client/__init__.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/lsp_client/diagnostics.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/node.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/programming_language.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_cli_parser.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_install.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_logging_config.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_pyproject_packages.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_registry_coverage.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_vscode_constants.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_windows_compatibility.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_windows_encoding.py +0 -0
- {codeboarding-0.11.0 → codeboarding-0.12.2}/vscode_constants.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codeboarding
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.2
|
|
4
4
|
Summary: Interactive Diagrams for Code
|
|
5
5
|
Author: CodeBoarding Team
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,6 @@ Description-Content-Type: text/markdown
|
|
|
18
18
|
License-File: LICENSE
|
|
19
19
|
Requires-Dist: docker>=7.1
|
|
20
20
|
Requires-Dist: dotenv>=0.9
|
|
21
|
-
Requires-Dist: duckdb>=1.3
|
|
22
21
|
Requires-Dist: dulwich>=0.22
|
|
23
22
|
Requires-Dist: fastapi>=0.115
|
|
24
23
|
Requires-Dist: filelock>=3.12
|
|
@@ -34,12 +33,15 @@ Requires-Dist: langchain-community>=0.4
|
|
|
34
33
|
Requires-Dist: langchain-google-genai>=3.1
|
|
35
34
|
Requires-Dist: langchain-ollama>=1.0
|
|
36
35
|
Requires-Dist: langchain-openai>=1.1
|
|
36
|
+
Requires-Dist: leidenalg>=0.10
|
|
37
37
|
Requires-Dist: markdown>=3.8
|
|
38
38
|
Requires-Dist: markdown-it-py>=3.0
|
|
39
39
|
Requires-Dist: markitdown>=0.1
|
|
40
40
|
Requires-Dist: networkx>=3.4
|
|
41
41
|
Requires-Dist: nodeenv>=1.10.0
|
|
42
42
|
Requires-Dist: pathspec>=0.12
|
|
43
|
+
Requires-Dist: posthog>=3.7
|
|
44
|
+
Requires-Dist: pydantic>=2.0
|
|
43
45
|
Requires-Dist: pyyaml>=6.0
|
|
44
46
|
Requires-Dist: regex>=2024.11
|
|
45
47
|
Requires-Dist: rich>=12.6
|
|
@@ -93,15 +95,17 @@ Dynamic: license-file
|
|
|
93
95
|
The recommended way to install the CLI is with [pipx](https://pipx.pypa.io), which automatically creates an isolated environment:
|
|
94
96
|
|
|
95
97
|
```bash
|
|
96
|
-
pipx install codeboarding --python python3.12
|
|
98
|
+
pipx install codeboarding --python python3.12 --pip-args="--extra-index-url https://pip.codeboarding.org/simple/"
|
|
97
99
|
```
|
|
98
100
|
|
|
99
101
|
Alternatively, install into an existing virtual environment with pip:
|
|
100
102
|
|
|
101
103
|
```bash
|
|
102
|
-
pip install codeboarding
|
|
104
|
+
pip install codeboarding --extra-index-url https://pip.codeboarding.org/simple/
|
|
103
105
|
```
|
|
104
106
|
|
|
107
|
+
|
|
108
|
+
|
|
105
109
|
> Installing into the global Python environment with `pip` is not recommended — it can cause dependency conflicts and will fail if the system Python is not 3.12 or 3.13.
|
|
106
110
|
|
|
107
111
|
Language server binaries are downloaded automatically on first use. To pre-install them explicitly (useful in CI or restricted environments):
|
|
@@ -23,15 +23,17 @@
|
|
|
23
23
|
The recommended way to install the CLI is with [pipx](https://pipx.pypa.io), which automatically creates an isolated environment:
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
pipx install codeboarding --python python3.12
|
|
26
|
+
pipx install codeboarding --python python3.12 --pip-args="--extra-index-url https://pip.codeboarding.org/simple/"
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Alternatively, install into an existing virtual environment with pip:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
pip install codeboarding
|
|
32
|
+
pip install codeboarding --extra-index-url https://pip.codeboarding.org/simple/
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
|
|
36
|
+
|
|
35
37
|
> Installing into the global Python environment with `pip` is not recommended — it can cause dependency conflicts and will fail if the system Python is not 3.12 or 3.13.
|
|
36
38
|
|
|
37
39
|
Language server binaries are downloaded automatically on first use. To pre-install them explicitly (useful in CI or restricted environments):
|
|
@@ -4,9 +4,9 @@ See what your AI is building before it breaks.
|
|
|
4
4
|
|
|
5
5
|
CodeBoarding gives developers and coding agents a visual map of a codebase. It combines static analysis with LLM reasoning to generate architecture diagrams, component-level documentation, and navigable outputs you can use in your IDE, CI, and docs.
|
|
6
6
|
|
|
7
|
-
[Website](https://codeboarding.org) · [Open VSX extension](https://open-vsx.org/extension/CodeBoarding/codeboarding) · [Explore examples](https://codeboarding.org/diagrams) · [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Codeboarding.codeboarding) · [GitHub Action](https://github.com/marketplace/actions/codeboarding-
|
|
7
|
+
[Website](https://codeboarding.org) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=0855d476-b2d0-44cc-b93d-69b47504719c" width="0" height="0" /> · [Open VSX extension](https://open-vsx.org/extension/CodeBoarding/codeboarding) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=ce87464c-2792-46b0-9ea2-87eefe853d7e" width="0" height="0" /> · [Explore examples](https://codeboarding.org/diagrams) · [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Codeboarding.codeboarding) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=8a3d26e0-6f6b-49c0-8482-114445de56a5" width="0" height="0" /> · [GitHub Action](https://github.com/marketplace/actions/codeboarding-action) ·[Discord](https://discord.gg/T5zHTJYFuy)
|
|
8
8
|
|
|
9
|
-
[](https://open-vsx.org/extension/CodeBoarding/codeboarding)
|
|
9
|
+
[](https://open-vsx.org/extension/CodeBoarding/codeboarding) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=ce87464c-2792-46b0-9ea2-87eefe853d7e" width="0" height="0" />
|
|
10
10
|
|
|
11
11
|
Install the extension from Open VSX.
|
|
12
12
|
|
|
@@ -86,7 +86,7 @@ codeboarding full --local /path/to/repo
|
|
|
86
86
|
Or, if you prefer pip, install into a virtual environment (not the global Python):
|
|
87
87
|
|
|
88
88
|
```bash
|
|
89
|
-
pip install codeboarding
|
|
89
|
+
pip install codeboarding --extra-index-url https://pip.codeboarding.org/simple/
|
|
90
90
|
codeboarding-setup
|
|
91
91
|
codeboarding full --local /path/to/repo
|
|
92
92
|
```
|
|
@@ -108,6 +108,8 @@ On first run, CodeBoarding creates `~/.codeboarding/config.toml`. Set one provid
|
|
|
108
108
|
# aws_bearer_token_bedrock = "..."
|
|
109
109
|
# ollama_base_url = "http://localhost:11434"
|
|
110
110
|
# openrouter_api_key = "sk-..."
|
|
111
|
+
# litellm_base_url = "http://localhost:4000" # LiteLLM proxy server URL (required)
|
|
112
|
+
# litellm_api_key = "sk-..." # LiteLLM proxy server key (optional)
|
|
111
113
|
|
|
112
114
|
[llm]
|
|
113
115
|
# agent_model = "gemini-3-flash"
|
|
@@ -138,19 +140,32 @@ python main.py full https://github.com/pytorch/pytorch
|
|
|
138
140
|
## Where to use it
|
|
139
141
|
|
|
140
142
|
- [CLI](https://github.com/CodeBoarding/CodeBoarding) for local analysis, automation, and CI workflows.
|
|
141
|
-
- [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Codeboarding.codeboarding) for in-editor visual architecture.
|
|
142
|
-
- [GitHub Action](https://github.com/marketplace/actions/codeboarding-
|
|
143
|
+
- [VS Code extension](https://marketplace.visualstudio.com/items?itemName=Codeboarding.codeboarding) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=8a3d26e0-6f6b-49c0-8482-114445de56a5" width="0" height="0" /> for in-editor visual architecture.
|
|
144
|
+
- [GitHub Action](https://github.com/marketplace/actions/codeboarding-action) to keep diagrams updated in CI.
|
|
143
145
|
|
|
144
146
|
## Supported stack
|
|
145
147
|
|
|
146
|
-
- Languages: Python, TypeScript, JavaScript, Java, Go, PHP, Rust
|
|
147
|
-
- LLM providers: OpenAI, Anthropic, Google, Vercel AI Gateway, AWS Bedrock, Ollama, OpenRouter, and more.
|
|
148
|
+
- Languages: Python, TypeScript, JavaScript, Java, Go, PHP, Rust, C#.
|
|
149
|
+
- LLM providers: OpenAI, Anthropic, Google, Vercel AI Gateway, AWS Bedrock, Ollama, OpenRouter, LiteLLM proxy, and more.
|
|
148
150
|
|
|
149
151
|
## Examples
|
|
150
152
|
|
|
151
153
|
- Visualized 800+ open-source repositories.
|
|
152
154
|
- Browse generated examples in [GeneratedOnBoardings](https://github.com/CodeBoarding/GeneratedOnBoardings).
|
|
153
|
-
- Try the hosted explorer at [codeboarding.org/diagrams](https://codeboarding.org/diagrams).
|
|
155
|
+
- Try the hosted explorer at [codeboarding.org/diagrams](https://codeboarding.org/diagrams) <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=0855d476-b2d0-44cc-b93d-69b47504719c" width="0" height="0" />.
|
|
156
|
+
|
|
157
|
+
## Telemetry
|
|
158
|
+
|
|
159
|
+
CodeBoarding collects anonymous, aggregate usage telemetry (which command ran,
|
|
160
|
+
success/failure, duration, and token cost) to help us improve the tool. It is on
|
|
161
|
+
by default and never collects source code, file names, repository names, paths,
|
|
162
|
+
prompts, model outputs, API keys, or any personal information. Opt out anytime:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
export CODEBOARDING_TELEMETRY=false # or: export DO_NOT_TRACK=1
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
See [TELEMETRY.md](TELEMETRY.md) for the full list of events and properties.
|
|
154
169
|
|
|
155
170
|
## Contributing
|
|
156
171
|
|
|
@@ -159,3 +174,5 @@ If you want to improve CodeBoarding, open an [issue](https://github.com/CodeBoar
|
|
|
159
174
|
## Vision
|
|
160
175
|
|
|
161
176
|
CodeBoarding is building an open standard for code understanding: a visual, accurate, high-level representation of a codebase that both humans and agents can use.
|
|
177
|
+
|
|
178
|
+
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=1942e7e7-0762-4cdd-9f08-024acc098071" />
|
|
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
|
5
5
|
from google.api_core.exceptions import ResourceExhausted
|
|
6
6
|
from langchain_core.exceptions import OutputParserException
|
|
7
7
|
from langchain_core.language_models import BaseChatModel
|
|
8
|
-
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
|
|
8
|
+
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage
|
|
9
9
|
from langchain_core.output_parsers import PydanticOutputParser
|
|
10
10
|
from langchain_core.prompts import PromptTemplate
|
|
11
11
|
from langchain.agents import create_agent
|
|
@@ -20,6 +20,7 @@ from agents.tools.toolkit import CodeBoardingToolkit
|
|
|
20
20
|
from agents.validation import ValidationResult, score_validation_results, VALIDATOR_WEIGHTS, DEFAULT_VALIDATOR_WEIGHT
|
|
21
21
|
from monitoring.mixin import MonitoringMixin
|
|
22
22
|
from repo_utils.ignore import RepoIgnoreManager
|
|
23
|
+
from agents.agent_responses import LLMBaseModel
|
|
23
24
|
from agents.llm_config import MONITORING_CALLBACK
|
|
24
25
|
from static_analyzer.analysis_result import StaticAnalysisResults
|
|
25
26
|
from static_analyzer.reference_resolve_mixin import ReferenceResolverMixin
|
|
@@ -43,10 +44,10 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
43
44
|
ReferenceResolverMixin.__init__(self, repo_dir, static_analysis)
|
|
44
45
|
MonitoringMixin.__init__(self)
|
|
45
46
|
self.parsing_llm = parsing_llm
|
|
47
|
+
self.agent_llm = agent_llm
|
|
46
48
|
self.repo_dir = repo_dir
|
|
47
49
|
self.ignore_manager = RepoIgnoreManager(repo_dir)
|
|
48
50
|
|
|
49
|
-
# Initialize the professional toolkit
|
|
50
51
|
context = RepoContext(repo_dir=repo_dir, ignore_manager=self.ignore_manager, static_analysis=static_analysis)
|
|
51
52
|
self.toolkit = CodeBoardingToolkit(context=context)
|
|
52
53
|
|
|
@@ -200,10 +201,10 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
200
201
|
except Empty:
|
|
201
202
|
raise RuntimeError("Agent invocation completed but no result was returned")
|
|
202
203
|
|
|
203
|
-
def _parse_invoke(self, prompt: str, type: type):
|
|
204
|
+
def _parse_invoke(self, prompt: str, type: type, include_hidden: bool = False):
|
|
204
205
|
response = self._invoke(prompt)
|
|
205
206
|
assert isinstance(response, str), f"Expected a string as response type got {response}"
|
|
206
|
-
return self._parse_response(prompt, response, type)
|
|
207
|
+
return self._parse_response(prompt, response, type, include_hidden=include_hidden)
|
|
207
208
|
|
|
208
209
|
def _score_result(self, result, validators: list, context) -> tuple[float, list[tuple[float, str]]]:
|
|
209
210
|
"""Run all validators on a result and return (score, prioritized_feedback).
|
|
@@ -233,7 +234,13 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
233
234
|
return score, weighted_feedback
|
|
234
235
|
|
|
235
236
|
def _validation_invoke(
|
|
236
|
-
self,
|
|
237
|
+
self,
|
|
238
|
+
prompt: str,
|
|
239
|
+
return_type: type,
|
|
240
|
+
validators: list,
|
|
241
|
+
context,
|
|
242
|
+
max_validation_attempts: int = 1,
|
|
243
|
+
include_hidden: bool = False,
|
|
237
244
|
):
|
|
238
245
|
"""
|
|
239
246
|
Invoke LLM with validation, feedback loop, and best-of-N selection.
|
|
@@ -261,7 +268,12 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
261
268
|
# Compute the maximum possible score so we can detect a perfect result
|
|
262
269
|
max_possible_score = sum(VALIDATOR_WEIGHTS.get(v.__name__, DEFAULT_VALIDATOR_WEIGHT) for v in validators)
|
|
263
270
|
|
|
264
|
-
result = self._parse_invoke(prompt, return_type)
|
|
271
|
+
result = self._parse_invoke(prompt, return_type, include_hidden=include_hidden)
|
|
272
|
+
logger.info(
|
|
273
|
+
"[Validation] Parsed %s: %s",
|
|
274
|
+
return_type.__name__,
|
|
275
|
+
result.llm_str()[:500],
|
|
276
|
+
)
|
|
265
277
|
|
|
266
278
|
# Track the best candidate across all attempts
|
|
267
279
|
best_result = result
|
|
@@ -314,42 +326,33 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
314
326
|
f"[Validation] Preparing attempt {attempt + 1}/{max_validation_attempts} "
|
|
315
327
|
f"with {len(weighted_feedback)} feedback items"
|
|
316
328
|
)
|
|
317
|
-
result = self._parse_invoke(feedback_prompt, return_type)
|
|
329
|
+
result = self._parse_invoke(feedback_prompt, return_type, include_hidden=include_hidden)
|
|
318
330
|
|
|
319
331
|
return best_result
|
|
320
332
|
|
|
321
|
-
def _parse_response(self, prompt, response, return_type, max_retries=5, attempt=0):
|
|
333
|
+
def _parse_response(self, prompt, response, return_type, max_retries=5, attempt=0, include_hidden: bool = False):
|
|
322
334
|
if response is None or response.strip() == "":
|
|
323
335
|
logger.error(f"Empty response for prompt: {prompt}")
|
|
324
336
|
|
|
337
|
+
if include_hidden and issubclass(return_type, LLMBaseModel):
|
|
338
|
+
schema = return_type.model_json_schema(include_hidden=True)
|
|
339
|
+
parser = PydanticOutputParser(pydantic_object=return_type)
|
|
340
|
+
format_instructions = (
|
|
341
|
+
f"The output should be formatted as a JSON instance that conforms to the JSON schema below.\n"
|
|
342
|
+
f"Here is the output schema:\n```json\n{json.dumps(schema, indent=2)}\n```"
|
|
343
|
+
)
|
|
344
|
+
else:
|
|
345
|
+
parser = PydanticOutputParser(pydantic_object=return_type)
|
|
346
|
+
format_instructions = parser.get_format_instructions()
|
|
347
|
+
|
|
325
348
|
def call_once():
|
|
326
|
-
# Extractor is rebuilt on every attempt — previous trustcall state
|
|
327
|
-
# may have corrupted attributes (see the tool_call_id bug below).
|
|
328
|
-
extractor = create_extractor(self.parsing_llm, tools=[return_type], tool_choice=return_type.__name__)
|
|
329
349
|
try:
|
|
330
|
-
result =
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
# 'ExtractionState' object has no attribute 'tool_call_id' during validation retry.
|
|
337
|
-
# Treat as a non-retriable fallback to the Pydantic parser.
|
|
338
|
-
if "tool_call_id" in str(e):
|
|
339
|
-
logger.warning(f"Trustcall bug encountered, falling back to Pydantic parser: {e}")
|
|
340
|
-
parser = PydanticOutputParser(pydantic_object=return_type)
|
|
341
|
-
return self._try_parse(response, parser)
|
|
342
|
-
raise
|
|
343
|
-
if "responses" in result and len(result["responses"]) != 0:
|
|
344
|
-
return return_type.model_validate(result["responses"][0])
|
|
345
|
-
if "messages" in result and len(result["messages"]) != 0:
|
|
346
|
-
message = result["messages"][0].content
|
|
347
|
-
parser = PydanticOutputParser(pydantic_object=return_type)
|
|
348
|
-
if not message:
|
|
349
|
-
raise EmptyExtractorMessageError("Extractor returned empty message content")
|
|
350
|
-
return self._try_parse(message, parser)
|
|
351
|
-
parser = PydanticOutputParser(pydantic_object=return_type)
|
|
352
|
-
return self._try_parse(response, parser)
|
|
350
|
+
result = self._structured_parse(response, parser, format_instructions=format_instructions)
|
|
351
|
+
logger.debug("[parse_response] structured_parse succeeded for %s", return_type.__name__)
|
|
352
|
+
return result
|
|
353
|
+
except Exception as e:
|
|
354
|
+
logger.warning("[parse_response] structured_parse failed for %s: %s", return_type.__name__, e)
|
|
355
|
+
return self._extractor_parse(response, return_type, parser, include_hidden=include_hidden)
|
|
353
356
|
|
|
354
357
|
def classify(exc: Exception, attempt: int) -> RetryDecision:
|
|
355
358
|
if isinstance(exc, ResourceExhausted):
|
|
@@ -359,20 +362,15 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
359
362
|
)
|
|
360
363
|
if isinstance(exc, (EmptyExtractorMessageError, IndexError, json.JSONDecodeError, ValueError)):
|
|
361
364
|
return RetryDecision(action=RetryAction.RETRY_NOW)
|
|
362
|
-
# AttributeError (non-tool_call_id) and any other exception: give up.
|
|
363
365
|
return RetryDecision(action=RetryAction.GIVE_UP)
|
|
364
366
|
|
|
365
367
|
def on_exhausted(exc: Exception):
|
|
366
|
-
# Preserve historic shape: ResourceExhausted surfaces the original exception;
|
|
367
|
-
# parse-error exhaustion wraps with a descriptive message naming the response.
|
|
368
368
|
if isinstance(exc, ResourceExhausted):
|
|
369
369
|
logger.error(f"Resource exhausted on final parsing attempt: {exc}")
|
|
370
370
|
raise exc
|
|
371
371
|
logger.error(f"Max retries ({max_retries}) reached for parsing response: {response}")
|
|
372
372
|
raise Exception(f"Max retries reached for parsing response: {response}")
|
|
373
373
|
|
|
374
|
-
# ``attempt`` kwarg kept for backwards-compat with callers that passed it;
|
|
375
|
-
# the effective attempt count is ``max_retries - attempt``.
|
|
376
374
|
return with_retries(
|
|
377
375
|
call_once,
|
|
378
376
|
max_attempts=max(1, max_retries - attempt),
|
|
@@ -381,19 +379,21 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
381
379
|
log_prefix="Parse response",
|
|
382
380
|
)
|
|
383
381
|
|
|
384
|
-
def
|
|
385
|
-
|
|
386
|
-
|
|
382
|
+
def _structured_parse(self, message_content, parser, format_instructions: str | None = None):
|
|
383
|
+
if format_instructions is None:
|
|
384
|
+
format_instructions = parser.get_format_instructions()
|
|
385
|
+
prompt_template = """You are a JSON expert. Here you need to extract information in the following json format: {format_instructions}
|
|
387
386
|
|
|
388
|
-
|
|
387
|
+
Here is the content to parse and fix: {adjective}
|
|
389
388
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
389
|
+
Please provide only the JSON output without any additional text."""
|
|
390
|
+
prompt = PromptTemplate(
|
|
391
|
+
template=prompt_template,
|
|
392
|
+
input_variables=["adjective"],
|
|
393
|
+
partial_variables={"format_instructions": format_instructions},
|
|
394
|
+
)
|
|
395
|
+
chain = prompt | self.parsing_llm | parser
|
|
396
|
+
try:
|
|
397
397
|
return chain.invoke(
|
|
398
398
|
{"adjective": message_content},
|
|
399
399
|
config={"callbacks": [MONITORING_CALLBACK, self.agent_monitoring_callback]},
|
|
@@ -401,7 +401,28 @@ class CodeBoardingAgent(ReferenceResolverMixin, MonitoringMixin):
|
|
|
401
401
|
except (ValidationError, OutputParserException):
|
|
402
402
|
for _, v in json.loads(message_content).items():
|
|
403
403
|
try:
|
|
404
|
-
return self.
|
|
404
|
+
return self._structured_parse(json.dumps(v), parser)
|
|
405
405
|
except:
|
|
406
406
|
pass
|
|
407
407
|
raise ValueError(f"Couldn't parse {message_content}")
|
|
408
|
+
|
|
409
|
+
def _extractor_parse(self, response, return_type, parser, include_hidden: bool = False):
|
|
410
|
+
extractor = create_extractor(self.parsing_llm, tools=[return_type], tool_choice=return_type.__name__)
|
|
411
|
+
try:
|
|
412
|
+
result = extractor.invoke(
|
|
413
|
+
return_type.extractor_str(include_hidden=include_hidden) + response,
|
|
414
|
+
config={"callbacks": [MONITORING_CALLBACK, self.agent_monitoring_callback]},
|
|
415
|
+
)
|
|
416
|
+
except AttributeError as e:
|
|
417
|
+
if "tool_call_id" in str(e):
|
|
418
|
+
logger.warning(f"Trustcall bug encountered: {e}")
|
|
419
|
+
raise
|
|
420
|
+
raise
|
|
421
|
+
if "responses" in result and len(result["responses"]) != 0:
|
|
422
|
+
return return_type.model_validate(result["responses"][0])
|
|
423
|
+
if "messages" in result and len(result["messages"]) != 0:
|
|
424
|
+
message = result["messages"][0].content
|
|
425
|
+
if not message:
|
|
426
|
+
raise EmptyExtractorMessageError("Extractor returned empty message content")
|
|
427
|
+
return self._structured_parse(message, parser)
|
|
428
|
+
raise EmptyExtractorMessageError("Extractor returned no responses and no messages")
|