# emmercm/igir architecture

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

- Interactive diagram: https://gitdiagram.com/emmercm/igir
- Repository: https://github.com/emmercm/igir

## Overview

Igir is a command-line ROM collection manager. The principal workflow is to accept commands and input/DAT options, scan ROMs and archives against DAT metadata, form and validate output candidates, then write or test results and generate reports or playlists. The README also documents directory-to-DAT, fixdat, cleanup, patching, filtering, and MAME set operations, represented as capability branches. Relationships involving unsampled modules are omitted or marked unverified; the sampled excerpts do not reveal the complete orchestration.

Main entry points: [`src/igir.ts`](https://github.com/emmercm/igir/blob/main/src/igir.ts) (Run orchestrator), [`index.ts`](https://github.com/emmercm/igir/blob/main/index.ts) (CLI entry), [`src/models/files/file.ts`](https://github.com/emmercm/igir/blob/main/src/models/files/file.ts) (File model), [`src/modules/argumentsParser.ts`](https://github.com/emmercm/igir/blob/main/src/modules/argumentsParser.ts) (Argument parser)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI and orchestration"]
  node_entry["CLI entry<br/>[index.ts]"]
  node_arguments["Argument parser<br/>[argumentsParser.ts]"]
  node_options["Run options<br/>[options.ts]"]
  node_orchestrator["Run orchestrator<br/>[igir.ts]"]
  node_logger["Logging<br/>[logger.ts]"]
end

subgraph group_catalog["DAT and ROM catalog"]
  node_dat["DAT models<br/>[dat.ts]"]
  node_datprocessing["DAT processing"]
  node_datinput["DAT scanner<br/>[datScanner.ts]"]
  node_romscan["ROM scanning<br/>[romScanner.ts]"]
  node_filemodel["File model<br/>[file.ts]"]
  node_archiveentry["Archive entries<br/>[archiveEntry.ts]"]
  node_checksums["Checksums<br/>[fileChecksums.ts]"]
  node_filefactory["File factory<br/>[fileFactory.ts]"]
  node_cache[("File cache<br/>[fileCache.ts]")]
end

subgraph group_processing["ROM processing"]
  node_candidates["Candidate generation"]
  node_validation["Candidate validation"]
  node_patches["Patch processing"]
  node_romprocessing["ROM processing"]
  node_zip["ZIP support<br/>[zipReader.ts]"]
  node_torrentzip["Torrent ZIP<br/>[tzWriter.ts]"]
  node_addons["Archive format add-ons"]
end

subgraph group_outputs["Outputs and reporting"]
  node_writer["Candidate writer<br/>[candidateWriter.ts]"]
  node_playlists["Playlist creation<br/>[playlistCreator.ts]"]
  node_status["Status generation<br/>[statusGenerator.ts]"]
  node_report["Report generation<br/>[reportGenerator.ts]"]
  node_dir2dat["Directory to DAT<br/>[dir2DatCreator.ts]"]
  node_fixdat["Fixdat creation<br/>[fixdatCreator.ts]"]
  node_cleaning["Output cleanup"]
end

node_user(("CLI user"))

node_user -->|"runs"| node_entry
node_entry -->|"parses commands"| node_arguments
node_entry -->|"starts run"| node_orchestrator
node_arguments -.->|"configures"| node_options
node_orchestrator -.->|"processes DATs"| node_datinput
node_datinput -.->|"loads"| node_dat
node_datprocessing -.->|"merges and filters"| node_dat
node_orchestrator -.->|"generates candidates"| node_candidates
node_orchestrator -->|"writes playlists"| node_playlists
node_orchestrator -->|"generates status"| node_status
node_orchestrator -->|"generates report"| node_report
node_orchestrator -->|"generates patched candidates"| node_patches
node_romscan -.->|"creates file objects"| node_filefactory
node_filefactory -->|"constructs files"| node_filemodel
node_filemodel -->|"calculates hashes"| node_checksums
node_archiveentry -->|"calculates entry hashes"| node_checksums
node_cache -->|"restores cached file"| node_filemodel
node_candidates -.->|"validates candidates"| node_validation
node_orchestrator -.->|"writes outputs"| node_writer
node_orchestrator -.->|"processes ROMs"| node_romprocessing
node_orchestrator -.->|"creates DAT"| node_dir2dat
node_orchestrator -.->|"creates fixdat"| node_fixdat
node_orchestrator -.->|"cleans output"| node_cleaning
node_zip -.->|"supports validation"| node_torrentzip
node_orchestrator -.->|"supports archive formats"| node_addons
node_entry -->|"uses logging"| node_logger

click node_entry "https://github.com/emmercm/igir/blob/main/index.ts"
click node_arguments "https://github.com/emmercm/igir/blob/main/src/modules/argumentsParser.ts"
click node_options "https://github.com/emmercm/igir/blob/main/src/models/options.ts"
click node_orchestrator "https://github.com/emmercm/igir/blob/main/src/igir.ts"
click node_dat "https://github.com/emmercm/igir/blob/main/src/models/dats/dat.ts"
click node_datprocessing "https://github.com/emmercm/igir/tree/main/src/modules/dats"
click node_datinput "https://github.com/emmercm/igir/blob/main/src/modules/dats/datScanner.ts"
click node_romscan "https://github.com/emmercm/igir/blob/main/src/modules/roms/romScanner.ts"
click node_filemodel "https://github.com/emmercm/igir/blob/main/src/models/files/file.ts"
click node_archiveentry "https://github.com/emmercm/igir/blob/main/src/models/files/archives/archiveEntry.ts"
click node_checksums "https://github.com/emmercm/igir/blob/main/src/models/files/fileChecksums.ts"
click node_filefactory "https://github.com/emmercm/igir/blob/main/src/factories/fileFactory.ts"
click node_cache "https://github.com/emmercm/igir/blob/main/src/cache/fileCache.ts"
click node_candidates "https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateGenerator.ts"
click node_validation "https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateValidator.ts"
click node_patches "https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidatePatchGenerator.ts"
click node_romprocessing "https://github.com/emmercm/igir/tree/main/src/modules/roms"
click node_writer "https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateWriter.ts"
click node_playlists "https://github.com/emmercm/igir/blob/main/src/modules/playlistCreator.ts"
click node_status "https://github.com/emmercm/igir/blob/main/src/modules/statusGenerator.ts"
click node_report "https://github.com/emmercm/igir/blob/main/src/modules/reportGenerator.ts"
click node_dir2dat "https://github.com/emmercm/igir/blob/main/src/modules/dir2DatCreator.ts"
click node_fixdat "https://github.com/emmercm/igir/blob/main/src/modules/fixdatCreator.ts"
click node_cleaning "https://github.com/emmercm/igir/tree/main/src/modules/cleaners"
click node_zip "https://github.com/emmercm/igir/blob/main/packages/zip/src/zipReader.ts"
click node_torrentzip "https://github.com/emmercm/igir/blob/main/packages/torrentzip/src/tzWriter.ts"
click node_addons "https://github.com/emmercm/igir/tree/main/addons"
click node_logger "https://github.com/emmercm/igir/blob/main/src/console/logger.ts"

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_arguments,node_options,node_orchestrator,node_logger,node_user toneBlue
class node_dat,node_datprocessing,node_datinput,node_romscan,node_filemodel,node_archiveentry,node_checksums,node_filefactory,node_cache toneAmber
class node_candidates,node_validation,node_patches,node_romprocessing,node_zip,node_torrentzip,node_addons toneMint
class node_writer,node_playlists,node_status,node_report,node_dir2dat,node_fixdat,node_cleaning toneRose
```

## Components

### CLI and orchestration

- [CLI entry](https://github.com/emmercm/igir/blob/main/index.ts): `index.ts`
- [Argument parser](https://github.com/emmercm/igir/blob/main/src/modules/argumentsParser.ts): `src/modules/argumentsParser.ts`
- [Run options](https://github.com/emmercm/igir/blob/main/src/models/options.ts): `src/models/options.ts`
- [Run orchestrator](https://github.com/emmercm/igir/blob/main/src/igir.ts): `src/igir.ts`
- [Logging](https://github.com/emmercm/igir/blob/main/src/console/logger.ts): `src/console/logger.ts`

### DAT and ROM catalog

- [DAT models](https://github.com/emmercm/igir/blob/main/src/models/dats/dat.ts): `src/models/dats/dat.ts`
- [DAT processing](https://github.com/emmercm/igir/tree/main/src/modules/dats): `src/modules/dats`
- [DAT scanner](https://github.com/emmercm/igir/blob/main/src/modules/dats/datScanner.ts): `src/modules/dats/datScanner.ts`
- [ROM scanning](https://github.com/emmercm/igir/blob/main/src/modules/roms/romScanner.ts): `src/modules/roms/romScanner.ts`
- [File model](https://github.com/emmercm/igir/blob/main/src/models/files/file.ts): `src/models/files/file.ts`
- [Archive entries](https://github.com/emmercm/igir/blob/main/src/models/files/archives/archiveEntry.ts): `src/models/files/archives/archiveEntry.ts`
- [Checksums](https://github.com/emmercm/igir/blob/main/src/models/files/fileChecksums.ts): `src/models/files/fileChecksums.ts`
- [File factory](https://github.com/emmercm/igir/blob/main/src/factories/fileFactory.ts): `src/factories/fileFactory.ts`
- [File cache](https://github.com/emmercm/igir/blob/main/src/cache/fileCache.ts): `src/cache/fileCache.ts`

### ROM processing

- [Candidate generation](https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateGenerator.ts): `src/modules/candidates/candidateGenerator.ts`
- [Candidate validation](https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateValidator.ts): `src/modules/candidates/candidateValidator.ts`
- [Patch processing](https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidatePatchGenerator.ts): `src/modules/candidates/candidatePatchGenerator.ts`
- [ROM processing](https://github.com/emmercm/igir/tree/main/src/modules/roms): `src/modules/roms`
- [ZIP support](https://github.com/emmercm/igir/blob/main/packages/zip/src/zipReader.ts): `packages/zip/src/zipReader.ts`
- [Torrent ZIP](https://github.com/emmercm/igir/blob/main/packages/torrentzip/src/tzWriter.ts): `packages/torrentzip/src/tzWriter.ts`
- [Archive format add-ons](https://github.com/emmercm/igir/tree/main/addons): `addons`

### Outputs and reporting

- [Candidate writer](https://github.com/emmercm/igir/blob/main/src/modules/candidates/candidateWriter.ts): `src/modules/candidates/candidateWriter.ts`
- [Playlist creation](https://github.com/emmercm/igir/blob/main/src/modules/playlistCreator.ts): `src/modules/playlistCreator.ts`
- [Status generation](https://github.com/emmercm/igir/blob/main/src/modules/statusGenerator.ts): `src/modules/statusGenerator.ts`
- [Report generation](https://github.com/emmercm/igir/blob/main/src/modules/reportGenerator.ts): `src/modules/reportGenerator.ts`
- [Directory to DAT](https://github.com/emmercm/igir/blob/main/src/modules/dir2DatCreator.ts): `src/modules/dir2DatCreator.ts`
- [Fixdat creation](https://github.com/emmercm/igir/blob/main/src/modules/fixdatCreator.ts): `src/modules/fixdatCreator.ts`
- [Output cleanup](https://github.com/emmercm/igir/tree/main/src/modules/cleaners): `src/modules/cleaners`

### Other components

- **CLI user**

## Connections

- CLI user → CLI entry: runs
- CLI entry → Argument parser: parses commands (evidence: `index.ts`)
- CLI entry → Run orchestrator: starts run (evidence: `index.ts`)
- Argument parser → Run options: configures (evidence: `src/modules/argumentsParser.ts`)
- Run orchestrator → DAT scanner: processes DATs
- DAT scanner → DAT models: loads
- DAT processing → DAT models: merges and filters
- Run orchestrator → Candidate generation: generates candidates (evidence: `src/igir.ts`)
- Run orchestrator → Playlist creation: writes playlists (evidence: `src/igir.ts`)
- Run orchestrator → Status generation: generates status (evidence: `src/igir.ts`)
- Run orchestrator → Report generation: generates report (evidence: `src/igir.ts`)
- Run orchestrator → Patch processing: generates patched candidates (evidence: `src/igir.ts`)
- ROM scanning → File factory: creates file objects
- File factory → File model: constructs files (evidence: `src/factories/fileFactory.ts`)
- File model → Checksums: calculates hashes (evidence: `src/models/files/fileChecksums.ts`)
- Archive entries → Checksums: calculates entry hashes (evidence: `src/models/files/archives/archiveEntry.ts`)
- File cache → File model: restores cached file (evidence: `src/cache/fileCache.ts`)
- Candidate generation → Candidate validation: validates candidates
- Run orchestrator → Candidate writer: writes outputs (evidence: `src/igir.ts`)
- Run orchestrator → ROM processing: processes ROMs
- Run orchestrator → Directory to DAT: creates DAT
- Run orchestrator → Fixdat creation: creates fixdat
- Run orchestrator → Output cleanup: cleans output (evidence: `src/igir.ts`)
- ZIP support → Torrent ZIP: supports validation
- Run orchestrator → Archive format add-ons: supports archive formats (evidence: `src/igir.ts`)
- CLI entry → Logging: uses logging (evidence: `index.ts`)
