# kgcorner/marga architecture

> Architecture diagram of the GitHub repository kgcorner/marga, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/kgcorner/marga
- Repository: https://github.com/kgcorner/marga

## Overview

Marga is a Maven plugin that scans compiled classes across the reactor, builds a Spring-aware method call graph, and writes a self-contained interactive HTML report. The main workflow is reactor classes → bytecode scan → graph construction → report. Optionally, a Git ref or supplied diff is mapped to changed methods and callers, with impact data included in the report. The viewer supports search, profiles, navigation links, and graph views. Some viewer behavior is documented but its implementation is not represented by sampled source; those links are omitted.

Main entry points: [`src/main/java/com/scriptchess/marga/mojo/MargaMojo.java`](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/mojo/MargaMojo.java) (Marga goal), [`src/main/java/com/scriptchess/marga/report/ReportWriter.java`](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/report/ReportWriter.java) (Report writer), [`src/main/java/com/scriptchess/marga/impact/ImpactAnalyzer.java`](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/ImpactAnalyzer.java) (Impact analyzer), [`src/main/java/com/scriptchess/marga/visitors/MargaClassVisitor.java`](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/visitors/MargaClassVisitor.java) (Class visitor)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_scan["Bytecode scan"]
  node_mojo["Marga goal<br/>[MargaMojo.java]"]
  node_scanner["Class-file scanner"]
  node_classvisitor["Class visitor"]
  node_methodvisitor["Method visitor"]
  node_scanned["Scanned classes<br/>[ScannedClass.java]"]
end

subgraph group_analysis["Graph and impact"]
  node_builder["Call graph builder"]
  node_graph["Compact call graph<br/>[CallGraph.java]"]
  node_analyzer["Impact analyzer"]
  node_impact["Impact results<br/>[Impact.java]"]
end

subgraph group_reporting["Report output"]
  node_writer["Report writer<br/>[ReportWriter.java]"]
  node_template["HTML template"]
  node_report["Interactive HTML report<br/>[ReportWriter.java]"]
end

subgraph group_inputs["Change inputs"]
  node_diffinput["Diff file"]
  node_git["Git repository"]
  node_gitdiff["Git diff parser<br/>[GitDiff.java]"]
end

node_maven(("Maven reactor"))
node_classes["Compiled classes"]
node_reader(("Report user"))

node_maven -->|"invokes goal"| node_mojo
node_mojo -->|"scans modules"| node_scanner
node_classes -->|"reads bytecode"| node_scanner
node_scanner -->|"visits classes"| node_classvisitor
node_classvisitor -->|"visits methods"| node_methodvisitor
node_classvisitor -->|"assembles metadata"| node_scanned
node_methodvisitor -->|"records method data"| node_scanned
node_mojo -->|"builds graph"| node_builder
node_builder -->|"consumes metadata"| node_scanned
node_builder -->|"produces graph"| node_graph
node_mojo -.->|"runs or parses diff"| node_gitdiff
node_gitdiff -.->|"runs git diff"| node_git
node_diffinput -.->|"supplies diff path"| node_mojo
node_mojo -.->|"analyzes changes"| node_analyzer
node_gitdiff -.->|"provides changed lines"| node_analyzer
node_analyzer -.->|"reads callers and lines"| node_graph
node_analyzer -.->|"produces impact"| node_impact
node_mojo -->|"writes report"| node_writer
node_writer -->|"serializes graph"| node_graph
node_writer -.->|"serializes impact"| node_impact
node_writer -->|"loads template"| node_template
node_writer -->|"generates HTML"| node_report
node_reader -->|"opens report"| node_report

click node_mojo "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/mojo/MargaMojo.java"
click node_scanner "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/scanner/MargaClassFileScanner.java"
click node_classvisitor "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/visitors/MargaClassVisitor.java"
click node_methodvisitor "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/visitors/MargaMethodVisitor.java"
click node_scanned "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/scan/ScannedClass.java"
click node_builder "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/graph/CallGraphBuilder.java"
click node_graph "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/graph/CallGraph.java"
click node_gitdiff "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/GitDiff.java"
click node_analyzer "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/ImpactAnalyzer.java"
click node_impact "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/Impact.java"
click node_writer "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/report/ReportWriter.java"
click node_template "https://github.com/kgcorner/marga/blob/master/src/main/resources/marga/report-template.html"
click node_report "https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/report/ReportWriter.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_mojo,node_scanner,node_classvisitor,node_methodvisitor,node_scanned,node_reader toneBlue
class node_builder,node_graph,node_analyzer,node_impact toneAmber
class node_writer,node_template,node_report toneMint
class node_diffinput,node_git,node_gitdiff toneRose
class node_maven,node_classes toneIndigo
```

## Components

### Bytecode scan

- [Marga goal](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/mojo/MargaMojo.java): `src/main/java/com/scriptchess/marga/mojo/MargaMojo.java`
- [Class-file scanner](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/scanner/MargaClassFileScanner.java): `src/main/java/com/scriptchess/marga/scanner/MargaClassFileScanner.java`
- [Class visitor](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/visitors/MargaClassVisitor.java): `src/main/java/com/scriptchess/marga/visitors/MargaClassVisitor.java`
- [Method visitor](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/visitors/MargaMethodVisitor.java): `src/main/java/com/scriptchess/marga/visitors/MargaMethodVisitor.java`
- [Scanned classes](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/scan/ScannedClass.java): `src/main/java/com/scriptchess/marga/scan/ScannedClass.java`

### Graph and impact

- [Call graph builder](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/graph/CallGraphBuilder.java): `src/main/java/com/scriptchess/marga/graph/CallGraphBuilder.java`
- [Compact call graph](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/graph/CallGraph.java): `src/main/java/com/scriptchess/marga/graph/CallGraph.java`
- [Impact analyzer](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/ImpactAnalyzer.java): `src/main/java/com/scriptchess/marga/impact/ImpactAnalyzer.java`
- [Impact results](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/Impact.java): `src/main/java/com/scriptchess/marga/impact/Impact.java`

### Report output

- [Report writer](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/report/ReportWriter.java): `src/main/java/com/scriptchess/marga/report/ReportWriter.java`
- [HTML template](https://github.com/kgcorner/marga/blob/master/src/main/resources/marga/report-template.html): `src/main/resources/marga/report-template.html`
- [Interactive HTML report](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/report/ReportWriter.java): `src/main/java/com/scriptchess/marga/report/ReportWriter.java`

### Change inputs

- **Diff file**
- **Git repository**
- [Git diff parser](https://github.com/kgcorner/marga/blob/master/src/main/java/com/scriptchess/marga/impact/GitDiff.java): `src/main/java/com/scriptchess/marga/impact/GitDiff.java`

### Other components

- **Maven reactor**
- **Compiled classes**
- **Report user**

## Connections

- Maven reactor → Marga goal: invokes goal
- Marga goal → Class-file scanner: scans modules
- Compiled classes → Class-file scanner: reads bytecode
- Class-file scanner → Class visitor: visits classes
- Class visitor → Method visitor: visits methods
- Class visitor → Scanned classes: assembles metadata
- Method visitor → Scanned classes: records method data
- Marga goal → Call graph builder: builds graph
- Call graph builder → Scanned classes: consumes metadata
- Call graph builder → Compact call graph: produces graph
- Marga goal → Git diff parser: runs or parses diff
- Git diff parser → Git repository: runs git diff
- Diff file → Marga goal: supplies diff path
- Marga goal → Impact analyzer: analyzes changes
- Git diff parser → Impact analyzer: provides changed lines
- Impact analyzer → Compact call graph: reads callers and lines
- Impact analyzer → Impact results: produces impact
- Marga goal → Report writer: writes report
- Report writer → Compact call graph: serializes graph
- Report writer → Impact results: serializes impact
- Report writer → HTML template: loads template
- Report writer → Interactive HTML report: generates HTML
- Report user → Interactive HTML report: opens report
