# kakrain/kenshipatcher architecture

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

- Interactive diagram: https://gitdiagram.com/kakrain/kenshipatcher
- Repository: https://github.com/kakrain/kenshipatcher

## Overview

Kenshi Patcher is a Windows desktop tool for filtering and merging Kenshi mod records into patch files. A modder selects mods in the UI and runs or updates patches; the patcher reads patch definitions, parses and evaluates their expressions, selects and merges records, and writes patch output with dependency metadata. The graph includes the documented v16/v17 support and humanoid/animal handling as capabilities, but their implementation details were not sampled. Relationships for those capabilities are therefore omitted; unsampled source is not treated as inspected.

Main entry points: [`PatchModel/Patcher.cs`](https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/Patcher.cs) (Patch Runner), [`ExpressionReader/Expression.cs`](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Expression.cs) (Expression Evaluator), [`Forms/MainForm.cs`](https://github.com/kakrain/kenshipatcher/blob/main/Forms/MainForm.cs) (Patch Manager), [`ExpressionReader/Parser.cs`](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Parser.cs) (Expression Parser)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Desktop UI"]
  node_entry["Application Entry<br/>[Program.cs]"]
  node_mainform["Patch Manager<br/>[MainForm.cs]"]
  node_config["Rule Configuration"]
end

subgraph group_rules["Patch Rules"]
  node_factory["Rule Dispatcher"]
  node_patchnodes["Rule Operations<br/>[PatcherNode.cs]"]
  node_parser["Expression Parser<br/>[Parser.cs]"]
  node_lexer["Lexer<br/>[Lexer.cs]"]
  node_tokens["Token Model<br/>[Token.cs]"]
  node_expressions["Expression Evaluator<br/>[Expression.cs]"]
  node_caster["Value Caster<br/>[ValueCaster.cs]"]
  node_missing["Missing Record Error"]
end

subgraph group_engine["Patch Engine"]
  node_patcher["Patch Runner<br/>[Patcher.cs]"]
  node_recorddata["Mod Records"]
end

subgraph group_metadata["Metadata"]
  node_meta_info["Mod File Metadata<br/>[MetaInfo.cs]"]
  node_metafile["Dependency Snapshot<br/>[MetaFile.cs]"]
  node_metareader["Metadata Reader<br/>[MetaReader.cs]"]
  node_metawriter["Metadata Writer<br/>[MetaWriter.cs]"]
end

node_modder(("Modder"))
node_modrepo["Mod Repository"]
node_modfiles[("Kenshi .mod Files")]

node_modder -->|"selects mods"| node_mainform
node_entry -->|"launches"| node_mainform
node_mainform -->|"loads mods"| node_modrepo
node_mainform -->|"runs patches"| node_patcher
node_mainform -->|"loads metadata"| node_meta_info
node_patcher -->|"creates rules"| node_factory
node_factory -->|"constructs nodes"| node_patchnodes
node_patchnodes -->|"parses expressions"| node_parser
node_patcher -->|"parses definitions"| node_parser
node_parser -->|"requests tokens"| node_lexer
node_lexer -->|"creates tokens"| node_tokens
node_parser -->|"builds expressions"| node_expressions
node_expressions -->|"resolves records"| node_patcher
node_expressions -->|"uses conversions"| node_caster
node_expressions -->|"raises error"| node_missing
node_expressions -->|"requests options"| node_config
node_patcher -.->|"filters and merges"| node_recorddata
node_patcher -->|"builds snapshot"| node_metafile
node_patcher -->|"reads prior metadata"| node_metareader
node_patcher -->|"writes metadata"| node_metawriter
node_metareader -->|"parses snapshot"| node_metafile
node_metafile -->|"stores entries"| node_meta_info
node_meta_info -->|"records file details"| node_modfiles
node_patcher -.->|"writes patch output"| node_modfiles

click node_entry "https://github.com/kakrain/kenshipatcher/blob/main/Program.cs"
click node_mainform "https://github.com/kakrain/kenshipatcher/blob/main/Forms/MainForm.cs"
click node_config "https://github.com/kakrain/kenshipatcher/blob/main/Forms/KPatcherConfigForm.cs"
click node_patcher "https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/Patcher.cs"
click node_factory "https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/PatcherNodeFactory.cs"
click node_patchnodes "https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/PatcherNode.cs"
click node_parser "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Parser.cs"
click node_lexer "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Lexer.cs"
click node_tokens "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Token.cs"
click node_expressions "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Expression.cs"
click node_caster "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/ValueCaster.cs"
click node_missing "https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/MissingRecordException.cs"
click node_meta_info "https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaInfo.cs"
click node_metafile "https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaFile.cs"
click node_metareader "https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaReader.cs"
click node_metawriter "https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaWriter.cs"

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_mainform,node_config toneBlue
class node_factory,node_patchnodes,node_parser,node_lexer,node_tokens,node_expressions,node_caster,node_missing,node_modfiles toneAmber
class node_patcher,node_recorddata toneMint
class node_meta_info,node_metafile,node_metareader,node_metawriter toneRose
class node_modder,node_modrepo toneIndigo
```

## Components

### Desktop UI

- [Application Entry](https://github.com/kakrain/kenshipatcher/blob/main/Program.cs): `Program.cs`
- [Patch Manager](https://github.com/kakrain/kenshipatcher/blob/main/Forms/MainForm.cs): `Forms/MainForm.cs`
- [Rule Configuration](https://github.com/kakrain/kenshipatcher/blob/main/Forms/KPatcherConfigForm.cs): `Forms/KPatcherConfigForm.cs`

### Patch Rules

- [Rule Dispatcher](https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/PatcherNodeFactory.cs): `PatchModel/PatcherNodeFactory.cs`
- [Rule Operations](https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/PatcherNode.cs): `PatchModel/PatcherNode.cs`
- [Expression Parser](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Parser.cs): `ExpressionReader/Parser.cs`
- [Lexer](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Lexer.cs): `ExpressionReader/Lexer.cs`
- [Token Model](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Token.cs): `ExpressionReader/Token.cs`
- [Expression Evaluator](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/Expression.cs): `ExpressionReader/Expression.cs`
- [Value Caster](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/ValueCaster.cs): `ExpressionReader/ValueCaster.cs`
- [Missing Record Error](https://github.com/kakrain/kenshipatcher/blob/main/ExpressionReader/MissingRecordException.cs): `ExpressionReader/MissingRecordException.cs`

### Patch Engine

- [Patch Runner](https://github.com/kakrain/kenshipatcher/blob/main/PatchModel/Patcher.cs): `PatchModel/Patcher.cs`
- **Mod Records**

### Metadata

- [Mod File Metadata](https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaInfo.cs): `Meta/MetaInfo.cs`
- [Dependency Snapshot](https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaFile.cs): `Meta/MetaFile.cs`
- [Metadata Reader](https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaReader.cs): `Meta/MetaReader.cs`
- [Metadata Writer](https://github.com/kakrain/kenshipatcher/blob/main/Meta/MetaWriter.cs): `Meta/MetaWriter.cs`

### Other components

- **Modder**
- **Mod Repository**
- **Kenshi .mod Files**

## Connections

- Modder → Patch Manager: selects mods (evidence: `Readme.md`)
- Application Entry → Patch Manager: launches (evidence: `Program.cs`)
- Patch Manager → Mod Repository: loads mods (evidence: `Forms/MainForm.cs`)
- Patch Manager → Patch Runner: runs patches (evidence: `Forms/MainForm.cs`)
- Patch Manager → Mod File Metadata: loads metadata (evidence: `Forms/MainForm.cs`)
- Patch Runner → Rule Dispatcher: creates rules (evidence: `PatchModel/Patcher.cs`)
- Rule Dispatcher → Rule Operations: constructs nodes (evidence: `PatchModel/PatcherNodeFactory.cs`)
- Rule Operations → Expression Parser: parses expressions (evidence: `PatchModel/PatcherNode.cs`)
- Patch Runner → Expression Parser: parses definitions (evidence: `PatchModel/Patcher.cs`)
- Expression Parser → Lexer: requests tokens (evidence: `ExpressionReader/Parser.cs`)
- Lexer → Token Model: creates tokens (evidence: `ExpressionReader/Lexer.cs`)
- Expression Parser → Expression Evaluator: builds expressions (evidence: `ExpressionReader/Parser.cs`)
- Expression Evaluator → Patch Runner: resolves records (evidence: `ExpressionReader/Expression.cs`)
- Expression Evaluator → Value Caster: uses conversions (evidence: `ExpressionReader/Expression.cs`)
- Expression Evaluator → Missing Record Error: raises error (evidence: `ExpressionReader/Expression.cs`)
- Expression Evaluator → Rule Configuration: requests options (evidence: `ExpressionReader/Expression.cs`)
- Patch Runner → Mod Records: filters and merges
- Patch Runner → Dependency Snapshot: builds snapshot (evidence: `PatchModel/Patcher.cs`)
- Patch Runner → Metadata Reader: reads prior metadata (evidence: `PatchModel/Patcher.cs`)
- Patch Runner → Metadata Writer: writes metadata (evidence: `PatchModel/Patcher.cs`)
- Metadata Reader → Dependency Snapshot: parses snapshot (evidence: `Meta/MetaReader.cs`)
- Dependency Snapshot → Mod File Metadata: stores entries (evidence: `Meta/MetaFile.cs`)
- Mod File Metadata → Kenshi .mod Files: records file details (evidence: `Meta/MetaInfo.cs`)
- Patch Runner → Kenshi .mod Files: writes patch output
