# eroshenkoam/xcresults architecture

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

- Interactive diagram: https://gitdiagram.com/eroshenkoam/xcresults
- Repository: https://github.com/eroshenkoam/xcresults

## Overview

xcresults is a CLI that reads Xcode .xcresult bundles and exports test summaries and attachments, primarily as Allure 2 results. The principal flow is command dispatch, xcresulttool extraction, formatting, attachment export, and optional post-processing. The README also documents JSON export and Allure report generation. Source excerpts show the optional broken-test and screenshot-carousel processors; some formatter and CLI details are only supported by the SOURCE INDEX, so unsampled relationships are omitted.

Main entry points: [`src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java) (Bundle Extraction), [`src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java) (Screenshot Carousel), [`src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java`](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java) (Allure Formatter), [`src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java`](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java) (Broken Test Rules)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI"]
  node_entry["Application Entry<br/>[XCResults.java]"]
  node_maincmd["Command Routing<br/>[MainCommand.java]"]
  node_exportcmd["Export Options<br/>[ExportCommand.java]"]
end

subgraph group_export["Result Export"]
  node_processor["Bundle Extraction"]
  node_allurefmt["Allure Formatter"]
  node_jsonfmt["JSON Formatter"]
  node_formatter["Formatter Contract"]
  node_metadata["Export Metadata<br/>[ExportMeta.java]"]
end

subgraph group_extensions["Post-processing"]
  node_postcontract["Post-process Contract"]
  node_broken["Broken Test Rules"]
  node_brokenconfig["Matcher Configuration<br/>[BrokenConfig.java]"]
  node_matcher["Status Matcher"]
  node_carouselproc["Screenshot Carousel"]
  node_carousel["Carousel Model<br/>[Carousel.java]"]
  node_carouselimage["Carousel Image<br/>[CarouselImage.java]"]
  node_template["Carousel Template<br/>[carousel.ftl]"]
end

subgraph group_support["Utilities"]
  node_freemarker["Template Rendering"]
  node_formatutil["Format Helpers<br/>[FormatUtil.java]"]
  node_processutil["Process Helpers<br/>[ProcessUtil.java]"]
end

node_user(("CLI User"))
node_bundle["XCResult Bundle"]
node_xcresulttool["xcresulttool"]
node_sips["sips Converter"]
node_allure["Allure Report CLI"]

node_user -->|"runs"| node_entry
node_entry -->|"creates command"| node_maincmd
node_maincmd -->|"routes export"| node_exportcmd
node_user -->|"supplies bundle"| node_exportcmd
node_exportcmd -->|"starts export"| node_processor
node_processor -->|"reads results"| node_bundle
node_processor -->|"invokes"| node_xcresulttool
node_processor -->|"converts images"| node_sips
node_processor -->|"uses formatter"| node_allurefmt
node_processor -->|"supports format"| node_jsonfmt
node_processor -->|"builds metadata"| node_metadata
node_allurefmt -->|"implements"| node_formatter
node_jsonfmt -->|"implements"| node_formatter
node_allurefmt -->|"formats with"| node_metadata
node_processor -->|"runs processors"| node_postcontract
node_processor -->|"registers optional"| node_broken
node_processor -->|"registers optional"| node_carouselproc
node_broken -->|"implements"| node_postcontract
node_broken -->|"reads rules"| node_brokenconfig
node_brokenconfig -->|"contains matchers"| node_matcher
node_carouselproc -->|"implements"| node_postcontract
node_carouselproc -->|"creates model"| node_carousel
node_carousel -->|"holds images"| node_carouselimage
node_carouselproc -->|"renders template"| node_freemarker
node_freemarker -->|"loads"| node_template
node_carouselproc -->|"names attachment"| node_formatutil
node_allurefmt -->|"uses helpers"| node_formatutil
node_processor -->|"uses helpers"| node_processutil
node_allure -->|"serves report"| node_user

click node_entry "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/XCResults.java"
click node_maincmd "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/MainCommand.java"
click node_exportcmd "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportCommand.java"
click node_processor "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java"
click node_allurefmt "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java"
click node_jsonfmt "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/JsonExportFormatter.java"
click node_formatter "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportFormatter.java"
click node_metadata "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportMeta.java"
click node_postcontract "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportPostProcessor.java"
click node_broken "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java"
click node_brokenconfig "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenConfig.java"
click node_matcher "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenStatusMatcher.java"
click node_carouselproc "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java"
click node_carousel "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/Carousel.java"
click node_carouselimage "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/CarouselImage.java"
click node_template "https://github.com/eroshenkoam/xcresults/blob/main/src/main/resources/templates/carousel.ftl"
click node_freemarker "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/FreemarkerUtil.java"
click node_formatutil "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/FormatUtil.java"
click node_processutil "https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/ProcessUtil.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_entry,node_maincmd,node_exportcmd,node_user toneBlue
class node_processor,node_allurefmt,node_jsonfmt,node_formatter,node_metadata toneAmber
class node_postcontract,node_broken,node_brokenconfig,node_matcher,node_carouselproc,node_carousel,node_carouselimage,node_template toneMint
class node_freemarker,node_formatutil,node_processutil toneRose
class node_bundle,node_xcresulttool,node_sips,node_allure toneIndigo
```

## Components

### CLI

- [Application Entry](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/XCResults.java): `src/main/java/io/eroshenkoam/xcresults/XCResults.java`
- [Command Routing](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/MainCommand.java): `src/main/java/io/eroshenkoam/xcresults/MainCommand.java`
- [Export Options](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportCommand.java): `src/main/java/io/eroshenkoam/xcresults/export/ExportCommand.java`

### Result Export

- [Bundle Extraction](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java): `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`
- [Allure Formatter](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java): `src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java`
- [JSON Formatter](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/JsonExportFormatter.java): `src/main/java/io/eroshenkoam/xcresults/export/JsonExportFormatter.java`
- [Formatter Contract](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportFormatter.java): `src/main/java/io/eroshenkoam/xcresults/export/ExportFormatter.java`
- [Export Metadata](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportMeta.java): `src/main/java/io/eroshenkoam/xcresults/export/ExportMeta.java`

### Post-processing

- [Post-process Contract](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/export/ExportPostProcessor.java): `src/main/java/io/eroshenkoam/xcresults/export/ExportPostProcessor.java`
- [Broken Test Rules](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java): `src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java`
- [Matcher Configuration](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenConfig.java): `src/main/java/io/eroshenkoam/xcresults/broken/BrokenConfig.java`
- [Status Matcher](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/broken/BrokenStatusMatcher.java): `src/main/java/io/eroshenkoam/xcresults/broken/BrokenStatusMatcher.java`
- [Screenshot Carousel](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java): `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`
- [Carousel Model](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/Carousel.java): `src/main/java/io/eroshenkoam/xcresults/carousel/Carousel.java`
- [Carousel Image](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/carousel/CarouselImage.java): `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselImage.java`
- [Carousel Template](https://github.com/eroshenkoam/xcresults/blob/main/src/main/resources/templates/carousel.ftl): `src/main/resources/templates/carousel.ftl`

### Utilities

- [Template Rendering](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/FreemarkerUtil.java): `src/main/java/io/eroshenkoam/xcresults/util/FreemarkerUtil.java`
- [Format Helpers](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/FormatUtil.java): `src/main/java/io/eroshenkoam/xcresults/util/FormatUtil.java`
- [Process Helpers](https://github.com/eroshenkoam/xcresults/blob/main/src/main/java/io/eroshenkoam/xcresults/util/ProcessUtil.java): `src/main/java/io/eroshenkoam/xcresults/util/ProcessUtil.java`

### Other components

- **CLI User**
- **XCResult Bundle**
- **xcresulttool**
- **sips Converter**
- **Allure Report CLI**

## Connections

- CLI User → Application Entry: runs (evidence: `README.md`)
- Application Entry → Command Routing: creates command (evidence: `src/main/java/io/eroshenkoam/xcresults/XCResults.java`)
- Command Routing → Export Options: routes export (evidence: `src/main/java/io/eroshenkoam/xcresults/MainCommand.java`)
- CLI User → Export Options: supplies bundle (evidence: `README.md`)
- Export Options → Bundle Extraction: starts export (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportCommand.java`)
- Bundle Extraction → XCResult Bundle: reads results (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → xcresulttool: invokes (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → sips Converter: converts images (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → Allure Formatter: uses formatter (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → JSON Formatter: supports format
- Bundle Extraction → Export Metadata: builds metadata (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Allure Formatter → Formatter Contract: implements (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportFormatter.java`)
- JSON Formatter → Formatter Contract: implements (evidence: `src/main/java/io/eroshenkoam/xcresults/export/JsonExportFormatter.java`)
- Allure Formatter → Export Metadata: formats with (evidence: `src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java`)
- Bundle Extraction → Post-process Contract: runs processors (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → Broken Test Rules: registers optional (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Bundle Extraction → Screenshot Carousel: registers optional (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Broken Test Rules → Post-process Contract: implements (evidence: `src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java`)
- Broken Test Rules → Matcher Configuration: reads rules (evidence: `src/main/java/io/eroshenkoam/xcresults/broken/BrokenPostProcessor.java`)
- Matcher Configuration → Status Matcher: contains matchers (evidence: `src/main/java/io/eroshenkoam/xcresults/broken/BrokenConfig.java`)
- Screenshot Carousel → Post-process Contract: implements (evidence: `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`)
- Screenshot Carousel → Carousel Model: creates model (evidence: `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`)
- Carousel Model → Carousel Image: holds images (evidence: `src/main/java/io/eroshenkoam/xcresults/carousel/Carousel.java`)
- Screenshot Carousel → Template Rendering: renders template (evidence: `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`)
- Template Rendering → Carousel Template: loads
- Screenshot Carousel → Format Helpers: names attachment (evidence: `src/main/java/io/eroshenkoam/xcresults/carousel/CarouselPostProcessor.java`)
- Allure Formatter → Format Helpers: uses helpers (evidence: `src/main/java/io/eroshenkoam/xcresults/export/Allure2ExportFormatter.java`)
- Bundle Extraction → Process Helpers: uses helpers (evidence: `src/main/java/io/eroshenkoam/xcresults/export/ExportProcessor.java`)
- Allure Report CLI → CLI User: serves report (evidence: `README.md`)
