Skip to content

Commit fe18a38

Browse files
brovattenclaudecodeboarding[bot]
authored
List each changed component's touched files in the PR comment (#27)
* feat: list each changed component's touched files in the PR comment One collapsed <details> block per changed top-level component, between the legend and the CTA, answering the question the colored diagram raises but can't: which files made this node change color. Files are the intersection of the component subtree's paths (file_methods[] plus key_entities[].reference_file — some engine outputs carry file linkage only in key_entities) with the PR's own git diff (--no-renames --name-only merge-base..head, the Files-changed set; --no-renames so a moved file's old path still appears for the donor component). Without a git listing it falls back to analysis-derived changes. Rollup parents label their changed sub-component count so dropdown and headline counts agree. HTML-escaped output, per-component (15 files) and total (10k chars) caps so the block plus the ~45k mermaid diagram stays under GitHub's 65,536-char comment limit. Best-effort: any failure omits the section, never the comment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(codeboarding): update architecture analysis [skip ci] --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: codeboarding[bot] <codeboarding[bot]@users.noreply.github.com>
1 parent bf7f565 commit fe18a38

5 files changed

Lines changed: 680 additions & 63 deletions

File tree

.codeboarding/analysis.json

Lines changed: 131 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"metadata": {
3-
"generated_at": "2026-06-11T16:41:16.710439+00:00",
4-
"commit_hash": "ba5d7787eaecfa38964dd4663606927d98e501ba",
3+
"generated_at": "2026-06-12T12:22:29.920827+00:00",
4+
"commit_hash": "20bfd68682a5f048e8120701230c98539acff2ca",
55
"repo_name": "CodeBoarding-action",
66
"depth_level": 1,
77
"file_coverage_summary": {
8-
"total_files": 15,
9-
"analyzed": 3,
10-
"not_analyzed": 12,
8+
"total_files": 17,
9+
"analyzed": 4,
10+
"not_analyzed": 13,
1111
"not_analyzed_by_reason": {
1212
"other": 9,
13-
"codeboardingignore": 3
13+
"codeboardingignore": 4
1414
}
1515
}
1616
},
17-
"description": "The CodeBoarding-action architecture is a CI/CD pipeline that automates architectural observability by comparing codebase versions, generating visual Mermaid.js diffs, and providing actionable IDE deep-links within GitHub Pull Requests.",
17+
"description": "The CodeBoarding-action project implements a pipeline that orchestrates static analysis of code branches, performs structural diffing to generate visual Mermaid.js diagrams, and integrates these insights into GitHub Pull Requests via interactive deep links and editor-specific metadata.",
1818
"files": {
1919
"scripts/cb_engine.py": {
2020
"method_keys": [
@@ -30,6 +30,17 @@
3030
"scripts/cb_engine.py|scripts.cb_engine.main"
3131
]
3232
},
33+
"scripts/build_component_files.py": {
34+
"method_keys": [
35+
"scripts/build_component_files.py|scripts.build_component_files._walk",
36+
"scripts/build_component_files.py|scripts.build_component_files._subtree_files",
37+
"scripts/build_component_files.py|scripts.build_component_files._subtree_methods",
38+
"scripts/build_component_files.py|scripts.build_component_files._changed_files_for",
39+
"scripts/build_component_files.py|scripts.build_component_files._block",
40+
"scripts/build_component_files.py|scripts.build_component_files.render_component_files",
41+
"scripts/build_component_files.py|scripts.build_component_files.main"
42+
]
43+
},
3344
"scripts/diff_to_mermaid.py": {
3445
"method_keys": [
3546
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid.load_analysis",
@@ -50,7 +61,6 @@
5061
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._display_status",
5162
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._Scope",
5263
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._Scope.__init__",
53-
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._Scope.resolve",
5464
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._filter_changed",
5565
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._filter_changed.touches",
5666
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._init_directive",
@@ -66,6 +76,7 @@
6676
"scripts/build_cta.py": {
6777
"method_keys": [
6878
"scripts/build_cta.py|scripts.build_cta.detect_editors",
79+
"scripts/build_cta.py|scripts.build_cta.build_webview_link",
6980
"scripts/build_cta.py|scripts.build_cta.build_cta",
7081
"scripts/build_cta.py|scripts.build_cta.build_cta.link",
7182
"scripts/build_cta.py|scripts.build_cta.main"
@@ -143,6 +154,55 @@
143154
"end_line": 257,
144155
"type": "FUNCTION"
145156
},
157+
"scripts/build_component_files.py|scripts.build_component_files._walk": {
158+
"file_path": "scripts/build_component_files.py",
159+
"qualified_name": "scripts.build_component_files._walk",
160+
"start_line": 56,
161+
"end_line": 62,
162+
"type": "FUNCTION"
163+
},
164+
"scripts/build_component_files.py|scripts.build_component_files._subtree_files": {
165+
"file_path": "scripts/build_component_files.py",
166+
"qualified_name": "scripts.build_component_files._subtree_files",
167+
"start_line": 65,
168+
"end_line": 74,
169+
"type": "FUNCTION"
170+
},
171+
"scripts/build_component_files.py|scripts.build_component_files._subtree_methods": {
172+
"file_path": "scripts/build_component_files.py",
173+
"qualified_name": "scripts.build_component_files._subtree_methods",
174+
"start_line": 77,
175+
"end_line": 85,
176+
"type": "FUNCTION"
177+
},
178+
"scripts/build_component_files.py|scripts.build_component_files._changed_files_for": {
179+
"file_path": "scripts/build_component_files.py",
180+
"qualified_name": "scripts.build_component_files._changed_files_for",
181+
"start_line": 88,
182+
"end_line": 101,
183+
"type": "FUNCTION"
184+
},
185+
"scripts/build_component_files.py|scripts.build_component_files._block": {
186+
"file_path": "scripts/build_component_files.py",
187+
"qualified_name": "scripts.build_component_files._block",
188+
"start_line": 104,
189+
"end_line": 121,
190+
"type": "FUNCTION"
191+
},
192+
"scripts/build_component_files.py|scripts.build_component_files.render_component_files": {
193+
"file_path": "scripts/build_component_files.py",
194+
"qualified_name": "scripts.build_component_files.render_component_files",
195+
"start_line": 124,
196+
"end_line": 175,
197+
"type": "FUNCTION"
198+
},
199+
"scripts/build_component_files.py|scripts.build_component_files.main": {
200+
"file_path": "scripts/build_component_files.py",
201+
"qualified_name": "scripts.build_component_files.main",
202+
"start_line": 178,
203+
"end_line": 213,
204+
"type": "FUNCTION"
205+
},
146206
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid.load_analysis": {
147207
"file_path": "scripts/diff_to_mermaid.py",
148208
"qualified_name": "scripts.diff_to_mermaid.load_analysis",
@@ -269,13 +329,6 @@
269329
"end_line": 298,
270330
"type": "METHOD"
271331
},
272-
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._Scope.resolve": {
273-
"file_path": "scripts/diff_to_mermaid.py",
274-
"qualified_name": "scripts.diff_to_mermaid._Scope.resolve",
275-
"start_line": 300,
276-
"end_line": 309,
277-
"type": "METHOD"
278-
},
279332
"scripts/diff_to_mermaid.py|scripts.diff_to_mermaid._filter_changed": {
280333
"file_path": "scripts/diff_to_mermaid.py",
281334
"qualified_name": "scripts.diff_to_mermaid._filter_changed",
@@ -349,36 +402,43 @@
349402
"scripts/build_cta.py|scripts.build_cta.detect_editors": {
350403
"file_path": "scripts/build_cta.py",
351404
"qualified_name": "scripts.build_cta.detect_editors",
352-
"start_line": 35,
353-
"end_line": 47,
405+
"start_line": 36,
406+
"end_line": 48,
407+
"type": "FUNCTION"
408+
},
409+
"scripts/build_cta.py|scripts.build_cta.build_webview_link": {
410+
"file_path": "scripts/build_cta.py",
411+
"qualified_name": "scripts.build_cta.build_webview_link",
412+
"start_line": 62,
413+
"end_line": 77,
354414
"type": "FUNCTION"
355415
},
356416
"scripts/build_cta.py|scripts.build_cta.build_cta": {
357417
"file_path": "scripts/build_cta.py",
358418
"qualified_name": "scripts.build_cta.build_cta",
359-
"start_line": 61,
360-
"end_line": 96,
419+
"start_line": 80,
420+
"end_line": 137,
361421
"type": "FUNCTION"
362422
},
363423
"scripts/build_cta.py|scripts.build_cta.build_cta.link": {
364424
"file_path": "scripts/build_cta.py",
365425
"qualified_name": "scripts.build_cta.build_cta.link",
366-
"start_line": 79,
367-
"end_line": 80,
426+
"start_line": 120,
427+
"end_line": 121,
368428
"type": "FUNCTION"
369429
},
370430
"scripts/build_cta.py|scripts.build_cta.main": {
371431
"file_path": "scripts/build_cta.py",
372432
"qualified_name": "scripts.build_cta.main",
373-
"start_line": 99,
374-
"end_line": 114,
433+
"start_line": 140,
434+
"end_line": 176,
375435
"type": "FUNCTION"
376436
}
377437
},
378438
"components": [
379439
{
380440
"name": "Analysis Orchestrator",
381-
"description": "Manages the execution lifecycle of the GitHub Action, including environment setup, triggering analysis, and data validation.",
441+
"description": "The central controller that manages the GitHub Action lifecycle, coordinating environment setup and triggering static analysis for base and head branches.",
382442
"key_entities": [
383443
{
384444
"qualified_name": "scripts.cb_engine.main",
@@ -399,10 +459,10 @@
399459
"reference_end_line": 153
400460
},
401461
{
402-
"qualified_name": "scripts.cb_engine.validate_base_analysis",
462+
"qualified_name": "scripts.cb_engine.run_health",
403463
"reference_file": "scripts/cb_engine.py",
404-
"reference_start_line": 45,
405-
"reference_end_line": 76
464+
"reference_start_line": 183,
465+
"reference_end_line": 212
406466
}
407467
],
408468
"source_cluster_ids": [
@@ -429,15 +489,9 @@
429489
"can_expand": true
430490
},
431491
{
432-
"name": "Visual Diff Generator",
433-
"description": "The core logic engine that compares structural metadata between codebase versions and renders differences into Mermaid.js graph syntax.",
492+
"name": "Visual Diff Engine",
493+
"description": "Responsible for calculating differences between base and head states, generating Mermaid.js visualizations, and mapping code-level changes to architectural components. This cluster (scripts.build_component_files.py) handles subtree walking, identifying changed files, and mapping methods to components via _subtree_methods and render_component_files. It interacts with the Analysis Orchestrator and Engagement Layer by providing the structured diff data required for visualization.",
434494
"key_entities": [
435-
{
436-
"qualified_name": "scripts.diff_to_mermaid.main",
437-
"reference_file": "scripts/diff_to_mermaid.py",
438-
"reference_start_line": 527,
439-
"reference_end_line": 568
440-
},
441495
{
442496
"qualified_name": "scripts.diff_to_mermaid.build_diff",
443497
"reference_file": "scripts/diff_to_mermaid.py",
@@ -455,15 +509,34 @@
455509
"reference_file": "scripts/diff_to_mermaid.py",
456510
"reference_start_line": 162,
457511
"reference_end_line": 207
512+
},
513+
{
514+
"qualified_name": "scripts.diff_to_mermaid.load_analysis",
515+
"reference_file": "scripts/diff_to_mermaid.py",
516+
"reference_start_line": 50,
517+
"reference_end_line": 54
458518
}
459519
],
460520
"source_cluster_ids": [
461521
2,
462522
3,
463523
4,
464-
5
524+
5,
525+
7
465526
],
466527
"file_methods": [
528+
{
529+
"file_path": "scripts/build_component_files.py",
530+
"methods": [
531+
"scripts.build_component_files._walk",
532+
"scripts.build_component_files._subtree_files",
533+
"scripts.build_component_files._subtree_methods",
534+
"scripts.build_component_files._changed_files_for",
535+
"scripts.build_component_files._block",
536+
"scripts.build_component_files.render_component_files",
537+
"scripts.build_component_files.main"
538+
]
539+
},
467540
{
468541
"file_path": "scripts/diff_to_mermaid.py",
469542
"methods": [
@@ -485,7 +558,6 @@
485558
"scripts.diff_to_mermaid._display_status",
486559
"scripts.diff_to_mermaid._Scope",
487560
"scripts.diff_to_mermaid._Scope.__init__",
488-
"scripts.diff_to_mermaid._Scope.resolve",
489561
"scripts.diff_to_mermaid._filter_changed",
490562
"scripts.diff_to_mermaid._filter_changed.touches",
491563
"scripts.diff_to_mermaid._init_directive",
@@ -503,26 +575,26 @@
503575
"can_expand": true
504576
},
505577
{
506-
"name": "UX & Integration Helper",
507-
"description": "Manages the generation of user-facing outputs, including GitHub comments, status checks, and interactive links (CTAs) for external viewing. This component integrates the new 'build_cta.py' logic to generate interactive webview links and editor-specific deep links, expanding its role from simple reporting to providing actionable CI/CD report navigation. It receives processed data from the Visual Diff Generator to finalize the GitHub Action output.",
578+
"name": "Engagement & Integration Layer",
579+
"description": "Generates user-facing metadata, detects developer environments, and creates CTA links to bridge GitHub PR comments with the interactive CodeBoarding platform.",
508580
"key_entities": [
509581
{
510-
"qualified_name": "scripts.build_cta.main",
582+
"qualified_name": "scripts.build_cta.build_cta",
511583
"reference_file": "scripts/build_cta.py",
512-
"reference_start_line": 99,
513-
"reference_end_line": 114
584+
"reference_start_line": 80,
585+
"reference_end_line": 137
514586
},
515587
{
516-
"qualified_name": "scripts.build_cta.build_cta",
588+
"qualified_name": "scripts.build_cta.build_webview_link",
517589
"reference_file": "scripts/build_cta.py",
518-
"reference_start_line": 61,
519-
"reference_end_line": 96
590+
"reference_start_line": 62,
591+
"reference_end_line": 77
520592
},
521593
{
522594
"qualified_name": "scripts.build_cta.detect_editors",
523595
"reference_file": "scripts/build_cta.py",
524-
"reference_start_line": 35,
525-
"reference_end_line": 47
596+
"reference_start_line": 36,
597+
"reference_end_line": 48
526598
}
527599
],
528600
"source_cluster_ids": [
@@ -533,6 +605,7 @@
533605
"file_path": "scripts/build_cta.py",
534606
"methods": [
535607
"scripts.build_cta.detect_editors",
608+
"scripts.build_cta.build_webview_link",
536609
"scripts.build_cta.build_cta",
537610
"scripts.build_cta.build_cta.link",
538611
"scripts.build_cta.main"
@@ -545,29 +618,29 @@
545618
],
546619
"components_relations": [
547620
{
548-
"relation": "Passes validated analysis artifacts to initiate structural comparison",
621+
"relation": "triggers state comparison and visualization",
549622
"src_name": "Analysis Orchestrator",
550-
"dst_name": "Visual Diff Generator",
623+
"dst_name": "Visual Diff Engine",
551624
"src_id": "1",
552625
"dst_id": "2",
553626
"edge_count": 0,
554627
"is_static": false
555628
},
556629
{
557-
"relation": "Provides context of changed files and components for deep-link generation",
558-
"src_name": "Visual Diff Generator",
559-
"dst_name": "UX & Integration Helper",
560-
"src_id": "2",
630+
"relation": "provides execution context for CTA generation",
631+
"src_name": "Analysis Orchestrator",
632+
"dst_name": "Engagement & Integration Layer",
633+
"src_id": "1",
561634
"dst_id": "3",
562635
"edge_count": 0,
563636
"is_static": false
564637
},
565638
{
566-
"relation": "Returns formatted markdown snippets and CTA links for final output",
567-
"src_name": "UX & Integration Helper",
568-
"dst_name": "Analysis Orchestrator",
569-
"src_id": "3",
570-
"dst_id": "1",
639+
"relation": "provides structured diff data for reporting",
640+
"src_name": "Visual Diff Engine",
641+
"dst_name": "Engagement & Integration Layer",
642+
"src_id": "2",
643+
"dst_id": "3",
571644
"edge_count": 0,
572645
"is_static": false
573646
}

.codeboarding/health/health_report.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"repository_name": "CodeBoarding-action",
3-
"timestamp": "2026-06-11T16:41:11.294364+00:00",
4-
"overall_score": 0.9996183206106869,
3+
"timestamp": "2026-06-12T12:22:22.416630+00:00",
4+
"overall_score": 0.9996710526315788,
55
"check_summaries": [
66
{
77
"check_name": "function_size",
88
"description": "Checks that functions/methods do not exceed line count thresholds",
99
"check_type": "standard",
10-
"total_entities_checked": 43,
10+
"total_entities_checked": 50,
1111
"findings_count": 0,
1212
"warning_count": 0,
1313
"score": 1.0,
@@ -17,7 +17,7 @@
1717
"check_name": "fan_out",
1818
"description": "Checks efferent coupling: how many other functions each function calls",
1919
"check_type": "standard",
20-
"total_entities_checked": 43,
20+
"total_entities_checked": 50,
2121
"findings_count": 0,
2222
"warning_count": 0,
2323
"score": 1.0,
@@ -27,7 +27,7 @@
2727
"check_name": "fan_in",
2828
"description": "Checks afferent coupling: how many other functions call each function",
2929
"check_type": "standard",
30-
"total_entities_checked": 43,
30+
"total_entities_checked": 50,
3131
"findings_count": 0,
3232
"warning_count": 0,
3333
"score": 1.0,

0 commit comments

Comments
 (0)