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.
Files changed (215) hide show
  1. {codeboarding-0.11.0/codeboarding.egg-info → codeboarding-0.12.2}/PKG-INFO +8 -4
  2. {codeboarding-0.11.0 → codeboarding-0.12.2}/PYPI.md +4 -2
  3. {codeboarding-0.11.0 → codeboarding-0.12.2}/README.md +25 -8
  4. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/agent.py +72 -51
  5. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/agent_responses.py +186 -32
  6. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/cluster_methods_mixin.py +80 -13
  7. codeboarding-0.12.2/agents/incremental_agent.py +787 -0
  8. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/llm_config.py +141 -45
  9. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/model_capabilities.py +6 -2
  10. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/__init__.py +4 -0
  11. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/abstract_prompt_factory.py +2 -2
  12. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/claude_prompts.py +82 -62
  13. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/deepseek_prompts.py +66 -42
  14. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/gemini_flash_prompts.py +53 -54
  15. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/glm_prompts.py +69 -36
  16. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/gpt_prompts.py +57 -54
  17. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/kimi_prompts.py +60 -50
  18. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/prompts/prompt_factory.py +4 -4
  19. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/validation.py +66 -1
  20. {codeboarding-0.11.0 → codeboarding-0.12.2/codeboarding.egg-info}/PKG-INFO +8 -4
  21. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/SOURCES.txt +14 -15
  22. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/requires.txt +3 -1
  23. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/top_level.txt +1 -1
  24. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/full_analysis.py +9 -0
  25. codeboarding-0.12.2/codeboarding_cli/commands/incremental_analysis.py +139 -0
  26. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/partial_analysis.py +0 -1
  27. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/__init__.py +4 -3
  28. codeboarding-0.12.2/codeboarding_workflows/analysis.py +239 -0
  29. {codeboarding-0.11.0 → codeboarding-0.12.2}/core/__init__.py +2 -1
  30. {codeboarding-0.11.0 → codeboarding-0.12.2}/core/protocols.py +2 -1
  31. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/analysis_json.py +6 -1
  32. codeboarding-0.12.2/diagram_analysis/cluster_delta.py +455 -0
  33. codeboarding-0.12.2/diagram_analysis/cluster_snapshot.py +101 -0
  34. codeboarding-0.12.2/diagram_analysis/diagram_generator.py +744 -0
  35. codeboarding-0.12.2/diagram_analysis/exceptions.py +43 -0
  36. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/io_utils.py +143 -33
  37. codeboarding-0.12.2/diagram_analysis/run_mode.py +10 -0
  38. {codeboarding-0.11.0 → codeboarding-0.12.2}/github_action.py +3 -1
  39. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/cohesion.py +6 -0
  40. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/runner.py +9 -3
  41. {codeboarding-0.11.0 → codeboarding-0.12.2}/health_main.py +2 -1
  42. {codeboarding-0.11.0 → codeboarding-0.12.2}/main.py +2 -6
  43. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/paths.py +4 -0
  44. {codeboarding-0.11.0 → codeboarding-0.12.2}/pyproject.toml +5 -4
  45. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/change_detector.py +4 -0
  46. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/diff_parser.py +16 -3
  47. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/git_ops.py +79 -43
  48. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/ignore.py +33 -0
  49. codeboarding-0.12.2/static_analyzer/__init__.py +802 -0
  50. codeboarding-0.12.2/static_analyzer/analysis_cache.py +475 -0
  51. codeboarding-0.12.2/static_analyzer/analysis_result.py +273 -0
  52. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cfg_skip_planner.py +7 -0
  53. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cluster_helpers.py +52 -30
  54. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/constants.py +2 -4
  55. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/csharp_config_scanner.py +14 -7
  56. codeboarding-0.12.2/static_analyzer/dotnet_sdk.py +327 -0
  57. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/csharp_adapter.py +75 -29
  58. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/go_adapter.py +1 -1
  59. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/language_adapter.py +6 -1
  60. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/lsp_client.py +15 -8
  61. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/graph.py +110 -22
  62. codeboarding-0.12.2/static_analyzer/incremental_orchestrator.py +125 -0
  63. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/java_utils.py +8 -10
  64. codeboarding-0.12.2/static_analyzer/language_results.py +128 -0
  65. codeboarding-0.12.2/static_analyzer/leiden_utils.py +103 -0
  66. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/reference_resolve_mixin.py +8 -4
  67. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/scanner.py +2 -0
  68. codeboarding-0.12.2/static_analyzer/typescript_config_scanner.py +235 -0
  69. codeboarding-0.12.2/telemetry/__init__.py +10 -0
  70. codeboarding-0.12.2/telemetry/device_id.py +91 -0
  71. codeboarding-0.12.2/telemetry/events.py +246 -0
  72. codeboarding-0.12.2/telemetry/schemas.py +67 -0
  73. codeboarding-0.12.2/telemetry/service.py +97 -0
  74. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_github_action.py +18 -6
  75. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_main.py +89 -16
  76. codeboarding-0.12.2/tests/test_telemetry_events.py +196 -0
  77. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_tool_registry.py +93 -8
  78. codeboarding-0.12.2/tests/test_user_config.py +220 -0
  79. {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/__init__.py +1 -0
  80. {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/installers.py +79 -4
  81. {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/manifest.py +8 -8
  82. {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/paths.py +13 -0
  83. {codeboarding-0.11.0 → codeboarding-0.12.2}/tool_registry/registry.py +5 -7
  84. {codeboarding-0.11.0 → codeboarding-0.12.2}/user_config.py +33 -7
  85. {codeboarding-0.11.0 → codeboarding-0.12.2}/utils.py +17 -0
  86. codeboarding-0.11.0/agents/analysis_patcher.py +0 -206
  87. codeboarding-0.11.0/codeboarding_cli/commands/incremental_analysis.py +0 -137
  88. codeboarding-0.11.0/codeboarding_workflows/analysis.py +0 -144
  89. codeboarding-0.11.0/diagram_analysis/diagram_generator.py +0 -679
  90. codeboarding-0.11.0/diagram_analysis/ease.py +0 -68
  91. codeboarding-0.11.0/diagram_analysis/incremental/delta.py +0 -84
  92. codeboarding-0.11.0/diagram_analysis/incremental/models.py +0 -220
  93. codeboarding-0.11.0/diagram_analysis/incremental/payload.py +0 -129
  94. codeboarding-0.11.0/diagram_analysis/incremental/pipeline.py +0 -264
  95. codeboarding-0.11.0/diagram_analysis/incremental/semantic_diff.py +0 -557
  96. codeboarding-0.11.0/diagram_analysis/incremental/trace_planner.py +0 -435
  97. codeboarding-0.11.0/diagram_analysis/incremental/tracer.py +0 -458
  98. codeboarding-0.11.0/diagram_analysis/incremental/updater.py +0 -460
  99. codeboarding-0.11.0/diagram_analysis/run_metadata.py +0 -146
  100. codeboarding-0.11.0/duckdb_crud.py +0 -125
  101. codeboarding-0.11.0/health/constants.py +0 -19
  102. codeboarding-0.11.0/output_generators/__init__.py +0 -0
  103. codeboarding-0.11.0/static_analyzer/__init__.py +0 -684
  104. codeboarding-0.11.0/static_analyzer/analysis_cache.py +0 -761
  105. codeboarding-0.11.0/static_analyzer/analysis_result.py +0 -488
  106. codeboarding-0.11.0/static_analyzer/cluster_change_analyzer.py +0 -391
  107. codeboarding-0.11.0/static_analyzer/incremental_orchestrator.py +0 -644
  108. codeboarding-0.11.0/static_analyzer/typescript_config_scanner.py +0 -54
  109. codeboarding-0.11.0/tests/test_user_config.py +0 -98
  110. {codeboarding-0.11.0 → codeboarding-0.12.2}/LICENSE +0 -0
  111. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/__init__.py +0 -0
  112. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/abstraction_agent.py +0 -0
  113. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/change_status.py +0 -0
  114. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/cluster_budget.py +0 -0
  115. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/constants.py +0 -0
  116. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/dependency_discovery.py +0 -0
  117. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/details_agent.py +0 -0
  118. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/meta_agent.py +0 -0
  119. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/planner_agent.py +0 -0
  120. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/retry.py +0 -0
  121. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/__init__.py +0 -0
  122. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/base.py +0 -0
  123. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/get_external_deps.py +0 -0
  124. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/get_method_invocations.py +0 -0
  125. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_cfg.py +0 -0
  126. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_docs.py +0 -0
  127. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_file.py +0 -0
  128. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_file_structure.py +0 -0
  129. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_packages.py +0 -0
  130. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_source.py +0 -0
  131. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/read_structure.py +0 -0
  132. {codeboarding-0.11.0 → codeboarding-0.12.2}/agents/tools/toolkit.py +0 -0
  133. {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/__init__.py +0 -0
  134. {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/cache.py +0 -0
  135. {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/details_cache.py +0 -0
  136. {codeboarding-0.11.0 → codeboarding-0.12.2}/caching/meta_cache.py +0 -0
  137. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/dependency_links.txt +0 -0
  138. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding.egg-info/entry_points.txt +0 -0
  139. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/__init__.py +0 -0
  140. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/bootstrap.py +0 -0
  141. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_cli/commands/__init__.py +0 -0
  142. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/orchestration.py +0 -0
  143. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/rendering.py +0 -0
  144. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/__init__.py +0 -0
  145. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/local.py +0 -0
  146. {codeboarding-0.11.0 → codeboarding-0.12.2}/codeboarding_workflows/sources/remote.py +0 -0
  147. {codeboarding-0.11.0 → codeboarding-0.12.2}/constants.py +0 -0
  148. {codeboarding-0.11.0 → codeboarding-0.12.2}/core/plugin_loader.py +0 -0
  149. {codeboarding-0.11.0 → codeboarding-0.12.2}/core/registry.py +0 -0
  150. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/__init__.py +0 -0
  151. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/file_coverage.py +0 -0
  152. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/run_context.py +0 -0
  153. {codeboarding-0.11.0 → codeboarding-0.12.2}/diagram_analysis/version.py +0 -0
  154. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/__init__.py +0 -0
  155. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/__init__.py +0 -0
  156. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/circular_deps.py +0 -0
  157. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/coupling.py +0 -0
  158. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/function_size.py +0 -0
  159. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/god_class.py +0 -0
  160. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/inheritance.py +0 -0
  161. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/instability.py +0 -0
  162. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/checks/unused_code_diagnostics.py +0 -0
  163. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/config.py +0 -0
  164. {codeboarding-0.11.0 → codeboarding-0.12.2}/health/models.py +0 -0
  165. {codeboarding-0.11.0 → codeboarding-0.12.2}/install.py +0 -0
  166. {codeboarding-0.11.0 → codeboarding-0.12.2}/logging_config.py +0 -0
  167. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/__init__.py +0 -0
  168. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/callbacks.py +0 -0
  169. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/context.py +0 -0
  170. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/mixin.py +0 -0
  171. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/stats.py +0 -0
  172. {codeboarding-0.11.0 → codeboarding-0.12.2}/monitoring/writers.py +0 -0
  173. {codeboarding-0.11.0/diagram_analysis/incremental → codeboarding-0.12.2/output_generators}/__init__.py +0 -0
  174. {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/html.py +0 -0
  175. {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/html_template.py +0 -0
  176. {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/markdown.py +0 -0
  177. {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/mdx.py +0 -0
  178. {codeboarding-0.11.0 → codeboarding-0.12.2}/output_generators/sphinx.py +0 -0
  179. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/__init__.py +0 -0
  180. {codeboarding-0.11.0 → codeboarding-0.12.2}/repo_utils/errors.py +0 -0
  181. {codeboarding-0.11.0 → codeboarding-0.12.2}/setup.cfg +0 -0
  182. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/cluster_relations.py +0 -0
  183. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/__init__.py +0 -0
  184. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/__init__.py +0 -0
  185. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/java_adapter.py +0 -0
  186. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/php_adapter.py +0 -0
  187. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/python_adapter.py +0 -0
  188. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/rust_adapter.py +0 -0
  189. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/adapters/typescript_adapter.py +0 -0
  190. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/call_graph_builder.py +0 -0
  191. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/edge_build_context.py +0 -0
  192. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/edge_builder.py +0 -0
  193. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/hierarchy_builder.py +0 -0
  194. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/lsp_constants.py +0 -0
  195. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/models.py +0 -0
  196. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/progress.py +0 -0
  197. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/protocols.py +0 -0
  198. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/result_converter.py +0 -0
  199. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/source_inspector.py +0 -0
  200. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/symbol_table.py +0 -0
  201. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/engine/utils.py +0 -0
  202. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/java_config_scanner.py +0 -0
  203. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/lsp_client/__init__.py +0 -0
  204. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/lsp_client/diagnostics.py +0 -0
  205. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/node.py +0 -0
  206. {codeboarding-0.11.0 → codeboarding-0.12.2}/static_analyzer/programming_language.py +0 -0
  207. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_cli_parser.py +0 -0
  208. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_install.py +0 -0
  209. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_logging_config.py +0 -0
  210. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_pyproject_packages.py +0 -0
  211. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_registry_coverage.py +0 -0
  212. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_vscode_constants.py +0 -0
  213. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_windows_compatibility.py +0 -0
  214. {codeboarding-0.11.0 → codeboarding-0.12.2}/tests/test_windows_encoding.py +0 -0
  215. {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.11.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-diagram-first-documentation) ·[Discord](https://discord.gg/T5zHTJYFuy)
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
- [![CodeBoarding demo](https://gist.githubusercontent.com/ivanmilevtues/1c4f921066613516cfd7b938014a6877/raw/611aec7711556807860ff2e1679a5dc4c0c23fed/CodeBoarding_extension_demo.gif)](https://open-vsx.org/extension/CodeBoarding/codeboarding)
9
+ [![CodeBoarding demo](https://gist.githubusercontent.com/ivanmilevtues/1c4f921066613516cfd7b938014a6877/raw/611aec7711556807860ff2e1679a5dc4c0c23fed/CodeBoarding_extension_demo.gif)](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-diagram-first-documentation) to keep diagrams updated in CI.
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, prompt: str, return_type: type, validators: list, context, max_validation_attempts: int = 1
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 = extractor.invoke(
331
- return_type.extractor_str() + response,
332
- config={"callbacks": [MONITORING_CALLBACK, self.agent_monitoring_callback]},
333
- )
334
- except AttributeError as e:
335
- # Trustcall bug: https://github.com/hinthornw/trustcall/issues/47
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 _try_parse(self, message_content, parser):
385
- try:
386
- prompt_template = """You are an JSON expert. Here you need to extract information in the following json format: {format_instructions}
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
- Here is the content to parse and fix: {adjective}
387
+ Here is the content to parse and fix: {adjective}
389
388
 
390
- Please provide only the JSON output without any additional text."""
391
- prompt = PromptTemplate(
392
- template=prompt_template,
393
- input_variables=["adjective"],
394
- partial_variables={"format_instructions": parser.get_format_instructions()},
395
- )
396
- chain = prompt | self.parsing_llm | parser
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._try_parse(json.dumps(v), parser)
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")