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.
Files changed (212) hide show
  1. {codeboarding-0.13.2/codeboarding.egg-info → codeboarding-0.13.3}/PKG-INFO +3 -3
  2. {codeboarding-0.13.2 → codeboarding-0.13.3}/PYPI.md +2 -2
  3. {codeboarding-0.13.2 → codeboarding-0.13.3}/README.md +4 -2
  4. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/abstraction_agent.py +26 -43
  5. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/agent.py +1 -1
  6. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/agent_responses.py +20 -16
  7. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/cluster_methods_mixin.py +136 -305
  8. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/content_hash.py +22 -0
  9. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/details_agent.py +19 -62
  10. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/file_index_models.py +10 -0
  11. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/incremental_agent.py +198 -27
  12. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/incremental_results.py +3 -0
  13. codeboarding-0.13.3/agents/planner_agent.py +181 -0
  14. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/__init__.py +0 -9
  15. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/abstract_prompt_factory.py +0 -16
  16. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/claude_prompts.py +19 -170
  17. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/deepseek_prompts.py +22 -169
  18. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/gemini_flash_prompts.py +20 -154
  19. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/glm_prompts.py +21 -178
  20. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/gpt_prompts.py +20 -151
  21. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/kimi_prompts.py +21 -152
  22. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/prompts/prompt_factory.py +0 -16
  23. codeboarding-0.13.3/agents/relation_edges.py +206 -0
  24. codeboarding-0.13.3/agents/repair.py +101 -0
  25. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/validation.py +0 -212
  26. {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/__init__.py +1 -2
  27. {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/details_cache.py +1 -21
  28. {codeboarding-0.13.2 → codeboarding-0.13.3/codeboarding.egg-info}/PKG-INFO +3 -3
  29. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/SOURCES.txt +1 -4
  30. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/full_analysis.py +7 -3
  31. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/analysis.py +17 -8
  32. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/__init__.py +5 -1
  33. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/analysis_json.py +52 -5
  34. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/cluster_delta.py +253 -34
  35. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/diagram_generator.py +760 -52
  36. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/exceptions.py +31 -6
  37. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/file_index.py +19 -1
  38. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/io_utils.py +61 -11
  39. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/run_context.py +11 -9
  40. codeboarding-0.13.3/diagram_analysis/scope_plan.py +267 -0
  41. {codeboarding-0.13.2 → codeboarding-0.13.3}/github_action.py +14 -2
  42. {codeboarding-0.13.2 → codeboarding-0.13.3}/main.py +3 -2
  43. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/stats.py +13 -0
  44. {codeboarding-0.13.2 → codeboarding-0.13.3}/pyproject.toml +6 -15
  45. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/__init__.py +8 -1
  46. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/ignore.py +21 -16
  47. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/__init__.py +1 -1
  48. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/analysis_cache.py +25 -3
  49. codeboarding-0.13.3/static_analyzer/cluster_helpers.py +577 -0
  50. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/cluster_relations.py +59 -5
  51. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/constants.py +9 -0
  52. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/csharp_adapter.py +4 -0
  53. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/go_adapter.py +25 -0
  54. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/php_adapter.py +32 -0
  55. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/call_graph_builder.py +21 -12
  56. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/edge_builder.py +19 -1
  57. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/language_adapter.py +12 -2
  58. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/lsp_client.py +61 -7
  59. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/models.py +6 -0
  60. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/protocols.py +3 -0
  61. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/result_converter.py +66 -2
  62. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/source_inspector.py +35 -0
  63. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/graph.py +90 -173
  64. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/incremental_orchestrator.py +31 -6
  65. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/language_results.py +6 -1
  66. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_github_action.py +43 -0
  67. codeboarding-0.13.2/agents/cluster_budget.py +0 -21
  68. codeboarding-0.13.2/agents/incremental_planning_agent.py +0 -305
  69. codeboarding-0.13.2/agents/planner_agent.py +0 -117
  70. codeboarding-0.13.2/agents/relation_edges.py +0 -52
  71. codeboarding-0.13.2/agents/repair.py +0 -276
  72. codeboarding-0.13.2/agents/scope_operations.py +0 -35
  73. codeboarding-0.13.2/static_analyzer/cfg_skip_planner.py +0 -214
  74. codeboarding-0.13.2/static_analyzer/cluster_helpers.py +0 -511
  75. {codeboarding-0.13.2 → codeboarding-0.13.3}/LICENSE +0 -0
  76. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/__init__.py +0 -0
  77. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/change_status.py +0 -0
  78. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/cluster_ids.py +0 -0
  79. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/constants.py +0 -0
  80. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/dependency_discovery.py +0 -0
  81. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/llm_config.py +0 -0
  82. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/llm_errors.py +0 -0
  83. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/meta_agent.py +0 -0
  84. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/model_capabilities.py +0 -0
  85. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/retry.py +0 -0
  86. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/scope_ids.py +0 -0
  87. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/__init__.py +0 -0
  88. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/base.py +0 -0
  89. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/component_bridge_edges.py +0 -0
  90. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/get_external_deps.py +0 -0
  91. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/get_method_invocations.py +0 -0
  92. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/list_git_changes.py +0 -0
  93. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_cfg.py +0 -0
  94. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_docs.py +0 -0
  95. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_file.py +0 -0
  96. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_file_structure.py +0 -0
  97. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_packages.py +0 -0
  98. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_source.py +0 -0
  99. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/read_structure.py +0 -0
  100. {codeboarding-0.13.2 → codeboarding-0.13.3}/agents/tools/toolkit.py +0 -0
  101. {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/cache.py +0 -0
  102. {codeboarding-0.13.2 → codeboarding-0.13.3}/caching/meta_cache.py +0 -0
  103. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/dependency_links.txt +0 -0
  104. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/entry_points.txt +0 -0
  105. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/requires.txt +0 -0
  106. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding.egg-info/top_level.txt +0 -0
  107. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/__init__.py +0 -0
  108. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/bootstrap.py +0 -0
  109. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/__init__.py +0 -0
  110. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/incremental_analysis.py +0 -0
  111. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/commands/partial_analysis.py +0 -0
  112. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_cli/view_instructions.py +0 -0
  113. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/__init__.py +0 -0
  114. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/orchestration.py +0 -0
  115. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/rendering.py +0 -0
  116. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/__init__.py +0 -0
  117. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/local.py +0 -0
  118. {codeboarding-0.13.2 → codeboarding-0.13.3}/codeboarding_workflows/sources/remote.py +0 -0
  119. {codeboarding-0.13.2 → codeboarding-0.13.3}/constants.py +0 -0
  120. {codeboarding-0.13.2 → codeboarding-0.13.3}/core/__init__.py +0 -0
  121. {codeboarding-0.13.2 → codeboarding-0.13.3}/core/plugin_loader.py +0 -0
  122. {codeboarding-0.13.2 → codeboarding-0.13.3}/core/protocols.py +0 -0
  123. {codeboarding-0.13.2 → codeboarding-0.13.3}/core/registry.py +0 -0
  124. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/cluster_snapshot.py +0 -0
  125. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/file_coverage.py +0 -0
  126. {codeboarding-0.13.2 → codeboarding-0.13.3}/diagram_analysis/run_mode.py +0 -0
  127. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/__init__.py +0 -0
  128. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/__init__.py +0 -0
  129. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/circular_deps.py +0 -0
  130. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/cohesion.py +0 -0
  131. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/coupling.py +0 -0
  132. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/function_size.py +0 -0
  133. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/god_class.py +0 -0
  134. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/inheritance.py +0 -0
  135. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/instability.py +0 -0
  136. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/checks/unused_code_diagnostics.py +0 -0
  137. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/config.py +0 -0
  138. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/models.py +0 -0
  139. {codeboarding-0.13.2 → codeboarding-0.13.3}/health/runner.py +0 -0
  140. {codeboarding-0.13.2 → codeboarding-0.13.3}/install.py +0 -0
  141. {codeboarding-0.13.2 → codeboarding-0.13.3}/logging_config.py +0 -0
  142. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/__init__.py +0 -0
  143. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/callbacks.py +0 -0
  144. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/context.py +0 -0
  145. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/mixin.py +0 -0
  146. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/paths.py +0 -0
  147. {codeboarding-0.13.2 → codeboarding-0.13.3}/monitoring/writers.py +0 -0
  148. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/__init__.py +0 -0
  149. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/html.py +0 -0
  150. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/html_template.py +0 -0
  151. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/markdown.py +0 -0
  152. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/mdx.py +0 -0
  153. {codeboarding-0.13.2 → codeboarding-0.13.3}/output_generators/sphinx.py +0 -0
  154. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/change_detector.py +0 -0
  155. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/errors.py +0 -0
  156. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/fingerprint_diff.py +0 -0
  157. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/git_ops.py +0 -0
  158. {codeboarding-0.13.2 → codeboarding-0.13.3}/repo_utils/path_utils.py +0 -0
  159. {codeboarding-0.13.2 → codeboarding-0.13.3}/setup.cfg +0 -0
  160. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/analysis_result.py +0 -0
  161. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/csharp_config_scanner.py +0 -0
  162. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/dotnet_sdk.py +0 -0
  163. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/__init__.py +0 -0
  164. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/__init__.py +0 -0
  165. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/java_adapter.py +0 -0
  166. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/python_adapter.py +0 -0
  167. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/rust_adapter.py +0 -0
  168. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/adapters/typescript_adapter.py +0 -0
  169. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/edge_build_context.py +0 -0
  170. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/hierarchy_builder.py +0 -0
  171. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/lsp_constants.py +0 -0
  172. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/progress.py +0 -0
  173. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/symbol_table.py +0 -0
  174. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/engine/utils.py +0 -0
  175. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/internal_references.py +0 -0
  176. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/java_config_scanner.py +0 -0
  177. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/java_utils.py +0 -0
  178. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/leiden_utils.py +0 -0
  179. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/lsp_client/__init__.py +0 -0
  180. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/lsp_client/diagnostics.py +0 -0
  181. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/method_cluster_paths.py +0 -0
  182. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/node.py +0 -0
  183. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/programming_language.py +0 -0
  184. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/reference_resolver.py +0 -0
  185. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/scanner.py +0 -0
  186. {codeboarding-0.13.2 → codeboarding-0.13.3}/static_analyzer/typescript_config_scanner.py +0 -0
  187. {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/__init__.py +0 -0
  188. {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/device_id.py +0 -0
  189. {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/events.py +0 -0
  190. {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/schemas.py +0 -0
  191. {codeboarding-0.13.2 → codeboarding-0.13.3}/telemetry/service.py +0 -0
  192. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_cli_parser.py +0 -0
  193. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_install.py +0 -0
  194. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_logging_config.py +0 -0
  195. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_main.py +0 -0
  196. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_pyproject_packages.py +0 -0
  197. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_registry_coverage.py +0 -0
  198. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_telemetry_events.py +0 -0
  199. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_tool_registry.py +0 -0
  200. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_user_config.py +0 -0
  201. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_view_instructions.py +0 -0
  202. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_vscode_constants.py +0 -0
  203. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_windows_compatibility.py +0 -0
  204. {codeboarding-0.13.2 → codeboarding-0.13.3}/tests/test_windows_encoding.py +0 -0
  205. {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/__init__.py +0 -0
  206. {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/installers.py +0 -0
  207. {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/manifest.py +0 -0
  208. {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/paths.py +0 -0
  209. {codeboarding-0.13.2 → codeboarding-0.13.3}/tool_registry/registry.py +0 -0
  210. {codeboarding-0.13.2 → codeboarding-0.13.3}/user_config.py +0 -0
  211. {codeboarding-0.13.2 → codeboarding-0.13.3}/utils.py +0 -0
  212. {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.2
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=1,
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` | Diagram depth (default: 1) |
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=1,
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` | Diagram depth (default: 1) |
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
- # Increase diagram depth
128
- python main.py full --local ./my-project --depth-level 2
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
- build_all_cluster_results,
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
- logger.info(f"[AbstractionAgent] Grouping CFG clusters for: {self.project_name}")
92
-
93
- programming_langs = self.static_analysis.get_languages()
94
-
95
- # Measure everything that wraps cfg_clusters (system message + rendered
96
- # template with an empty slot) so the skip planner can back it out of
97
- # the input window before budgeting the cluster string.
98
- overhead_chars = len(str(self.system_message.content)) + len(
99
- self.prompts["group_clusters"].format(
100
- cfg_clusters="",
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: Group related clusters together into logical components
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: Generate abstract components from grouped clusters
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, ToolMessage
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, Optional
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, MethodEntry
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 looking up component names."""
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
- relation.src_id = name_to_id.get(relation.src_name, "")
659
- relation.dst_id = name_to_id.get(relation.dst_name, "")
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"