# cweagans/composer-patches architecture

> Architecture diagram of the GitHub repository cweagans/composer-patches, 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/cweagans/composer-patches
- Repository: https://github.com/cweagans/composer-patches

## Overview

Composer Patches is a Composer plugin that resolves patch definitions, downloads and caches patch files, then applies them to installed dependencies. Its plugin class coordinates those stages and exposes commands, lock handling, and extension events. The graph includes the documented local/remote patch capability and the sampled provider, resolver, downloader, and patcher layers. Some subsystem wiring is supported by the SOURCE INDEX rather than inspected implementation; uncertain event and command relationships are omitted.

Main entry points: [`src/Plugin/Patches.php`](https://github.com/cweagans/composer-patches/blob/main/src/Plugin/Patches.php) (Patches plugin), [`src/Patcher.php`](https://github.com/cweagans/composer-patches/blob/main/src/Patcher.php) (Patcher coordinator), [`src/Capability/CommandProvider.php`](https://github.com/cweagans/composer-patches/blob/main/src/Capability/CommandProvider.php) (Command provider), [`src/Resolver.php`](https://github.com/cweagans/composer-patches/blob/main/src/Resolver.php) (Resolver coordinator)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_plugin["Plugin lifecycle"]
  node_plugin["Patches plugin<br/>[Patches.php]"]
  node_events["Plugin events<br/>[PluginEvent.php]"]
  node_patch_events["Patch events<br/>[PatchEvent.php]"]
end

subgraph group_definitions["Patch definitions"]
  node_patch["Patch model<br/>[Patch.php]"]
  node_collection["Patch collection"]
  node_resolver["Resolver coordinator<br/>[Resolver.php]"]
  node_resolver_provider["Resolver providers"]
  node_resolver_types["Built-in resolvers"]
  node_resolver_base["Resolver base<br/>[ResolverBase.php]"]
  node_locker[("Patch lock state<br/>[Locker.php]")]
end

subgraph group_delivery["Download and apply"]
  node_downloader["Download coordinator<br/>[Downloader.php]"]
  node_downloader_provider["Downloader providers"]
  node_composer_downloader["HTTP downloader"]
  node_download_contract["Downloader contract"]
  node_patcher["Patcher coordinator<br/>[Patcher.php]"]
  node_patcher_provider["Patcher providers"]
  node_patcher_types["Built-in patchers"]
  node_patcher_contract["Patcher contract"]
end

subgraph group_operations["Commands and state"]
  node_commands_provider["Command provider"]
  node_doctor["Environment doctor<br/>[DoctorCommand.php]"]
  node_patch_commands["Patch commands"]
  node_relock["Relock command<br/>[RelockCommand.php]"]
  node_repatch["Repatch command<br/>[RepatchCommand.php]"]
end

node_composer(("Composer"))
node_patch_files["Local or remote patch"]
node_installed["Installed dependencies"]

node_composer -->|"invokes plugin"| node_plugin
node_plugin -->|"loads definitions"| node_resolver
node_resolver -->|"discovers providers"| node_resolver_provider
node_resolver_provider -->|"provides resolvers"| node_resolver_types
node_resolver_types -->|"shares base"| node_resolver_base
node_resolver -->|"returns collection"| node_collection
node_resolver_base -->|"creates patches"| node_patch
node_plugin -->|"iterates patches"| node_collection
node_plugin -->|"downloads patches"| node_downloader
node_downloader -->|"discovers providers"| node_downloader_provider
node_downloader_provider -->|"provides downloader"| node_composer_downloader
node_downloader -->|"validates implementations"| node_download_contract
node_composer_downloader -->|"fetches and hashes"| node_patch_files
node_plugin -->|"applies patches"| node_patcher
node_patcher -->|"discovers providers"| node_patcher_provider
node_patcher_provider -->|"provides patchers"| node_patcher_types
node_patcher -->|"validates implementations"| node_patcher_contract
node_patcher -->|"applies to path"| node_installed
node_plugin -->|"uses lock state"| node_locker
node_plugin -->|"registers commands"| node_commands_provider
node_commands_provider -->|"provides command"| node_doctor
node_commands_provider -->|"provides command"| node_relock
node_commands_provider -->|"provides command"| node_repatch
node_doctor -->|"checks patchers"| node_patcher_provider
node_relock -->|"extends commands"| node_patch_commands
node_repatch -->|"extends commands"| node_patch_commands
node_patch_commands -->|"accesses plugin"| node_plugin
node_plugin -.->|"dispatches discovery events"| node_events
node_plugin -->|"dispatches patch events"| node_patch_events

click node_plugin "https://github.com/cweagans/composer-patches/blob/main/src/Plugin/Patches.php"
click node_patch "https://github.com/cweagans/composer-patches/blob/main/src/Patch.php"
click node_collection "https://github.com/cweagans/composer-patches/blob/main/src/PatchCollection.php"
click node_resolver "https://github.com/cweagans/composer-patches/blob/main/src/Resolver.php"
click node_resolver_provider "https://github.com/cweagans/composer-patches/blob/main/src/Capability/Resolver/ResolverProvider.php"
click node_resolver_types "https://github.com/cweagans/composer-patches/tree/main/src/Resolver"
click node_resolver_base "https://github.com/cweagans/composer-patches/blob/main/src/Resolver/ResolverBase.php"
click node_locker "https://github.com/cweagans/composer-patches/blob/main/src/Locker.php"
click node_downloader "https://github.com/cweagans/composer-patches/blob/main/src/Downloader.php"
click node_downloader_provider "https://github.com/cweagans/composer-patches/blob/main/src/Capability/Downloader/DownloaderProvider.php"
click node_composer_downloader "https://github.com/cweagans/composer-patches/blob/main/src/Downloader/ComposerDownloader.php"
click node_download_contract "https://github.com/cweagans/composer-patches/blob/main/src/Downloader/DownloaderInterface.php"
click node_patcher "https://github.com/cweagans/composer-patches/blob/main/src/Patcher.php"
click node_patcher_provider "https://github.com/cweagans/composer-patches/blob/main/src/Capability/Patcher/PatcherProvider.php"
click node_patcher_types "https://github.com/cweagans/composer-patches/tree/main/src/Patcher"
click node_patcher_contract "https://github.com/cweagans/composer-patches/blob/main/src/Patcher/PatcherInterface.php"
click node_commands_provider "https://github.com/cweagans/composer-patches/blob/main/src/Capability/CommandProvider.php"
click node_doctor "https://github.com/cweagans/composer-patches/blob/main/src/Command/DoctorCommand.php"
click node_patch_commands "https://github.com/cweagans/composer-patches/blob/main/src/Command/PatchesCommandBase.php"
click node_relock "https://github.com/cweagans/composer-patches/blob/main/src/Command/RelockCommand.php"
click node_repatch "https://github.com/cweagans/composer-patches/blob/main/src/Command/RepatchCommand.php"
click node_events "https://github.com/cweagans/composer-patches/blob/main/src/Event/PluginEvent.php"
click node_patch_events "https://github.com/cweagans/composer-patches/blob/main/src/Event/PatchEvent.php"

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_plugin,node_events,node_patch_events toneBlue
class node_patch,node_collection,node_resolver,node_resolver_provider,node_resolver_types,node_resolver_base,node_locker toneAmber
class node_downloader,node_downloader_provider,node_composer_downloader,node_download_contract,node_patcher,node_patcher_provider,node_patcher_types,node_patcher_contract toneMint
class node_commands_provider,node_doctor,node_patch_commands,node_relock,node_repatch toneRose
class node_composer,node_patch_files,node_installed toneIndigo
```

## Components

### Plugin lifecycle

- [Patches plugin](https://github.com/cweagans/composer-patches/blob/main/src/Plugin/Patches.php): `src/Plugin/Patches.php`
- [Plugin events](https://github.com/cweagans/composer-patches/blob/main/src/Event/PluginEvent.php): `src/Event/PluginEvent.php`
- [Patch events](https://github.com/cweagans/composer-patches/blob/main/src/Event/PatchEvent.php): `src/Event/PatchEvent.php`

### Patch definitions

- [Patch model](https://github.com/cweagans/composer-patches/blob/main/src/Patch.php): `src/Patch.php`
- [Patch collection](https://github.com/cweagans/composer-patches/blob/main/src/PatchCollection.php): `src/PatchCollection.php`
- [Resolver coordinator](https://github.com/cweagans/composer-patches/blob/main/src/Resolver.php): `src/Resolver.php`
- [Resolver providers](https://github.com/cweagans/composer-patches/blob/main/src/Capability/Resolver/ResolverProvider.php): `src/Capability/Resolver/ResolverProvider.php`
- [Built-in resolvers](https://github.com/cweagans/composer-patches/tree/main/src/Resolver): `src/Resolver`
- [Resolver base](https://github.com/cweagans/composer-patches/blob/main/src/Resolver/ResolverBase.php): `src/Resolver/ResolverBase.php`
- [Patch lock state](https://github.com/cweagans/composer-patches/blob/main/src/Locker.php): `src/Locker.php`

### Download and apply

- [Download coordinator](https://github.com/cweagans/composer-patches/blob/main/src/Downloader.php): `src/Downloader.php`
- [Downloader providers](https://github.com/cweagans/composer-patches/blob/main/src/Capability/Downloader/DownloaderProvider.php): `src/Capability/Downloader/DownloaderProvider.php`
- [HTTP downloader](https://github.com/cweagans/composer-patches/blob/main/src/Downloader/ComposerDownloader.php): `src/Downloader/ComposerDownloader.php`
- [Downloader contract](https://github.com/cweagans/composer-patches/blob/main/src/Downloader/DownloaderInterface.php): `src/Downloader/DownloaderInterface.php`
- [Patcher coordinator](https://github.com/cweagans/composer-patches/blob/main/src/Patcher.php): `src/Patcher.php`
- [Patcher providers](https://github.com/cweagans/composer-patches/blob/main/src/Capability/Patcher/PatcherProvider.php): `src/Capability/Patcher/PatcherProvider.php`
- [Built-in patchers](https://github.com/cweagans/composer-patches/tree/main/src/Patcher): `src/Patcher`
- [Patcher contract](https://github.com/cweagans/composer-patches/blob/main/src/Patcher/PatcherInterface.php): `src/Patcher/PatcherInterface.php`

### Commands and state

- [Command provider](https://github.com/cweagans/composer-patches/blob/main/src/Capability/CommandProvider.php): `src/Capability/CommandProvider.php`
- [Environment doctor](https://github.com/cweagans/composer-patches/blob/main/src/Command/DoctorCommand.php): `src/Command/DoctorCommand.php`
- [Patch commands](https://github.com/cweagans/composer-patches/blob/main/src/Command/PatchesCommandBase.php): `src/Command/PatchesCommandBase.php`
- [Relock command](https://github.com/cweagans/composer-patches/blob/main/src/Command/RelockCommand.php): `src/Command/RelockCommand.php`
- [Repatch command](https://github.com/cweagans/composer-patches/blob/main/src/Command/RepatchCommand.php): `src/Command/RepatchCommand.php`

### Other components

- **Composer**
- **Local or remote patch**
- **Installed dependencies**

## Connections

- Composer → Patches plugin: invokes plugin
- Patches plugin → Resolver coordinator: loads definitions (evidence: `src/Plugin/Patches.php`)
- Resolver coordinator → Resolver providers: discovers providers (evidence: `src/Resolver.php`)
- Resolver providers → Built-in resolvers: provides resolvers (evidence: `src/Capability/Resolver/ResolverProvider.php`)
- Built-in resolvers → Resolver base: shares base (evidence: `src/Resolver/Dependencies.php`)
- Resolver coordinator → Patch collection: returns collection (evidence: `src/Resolver.php`)
- Resolver base → Patch model: creates patches (evidence: `src/Resolver/ResolverBase.php`)
- Patches plugin → Patch collection: iterates patches (evidence: `src/Plugin/Patches.php`)
- Patches plugin → Download coordinator: downloads patches (evidence: `src/Plugin/Patches.php`)
- Download coordinator → Downloader providers: discovers providers (evidence: `src/Downloader.php`)
- Downloader providers → HTTP downloader: provides downloader
- Download coordinator → Downloader contract: validates implementations (evidence: `src/Downloader.php`)
- HTTP downloader → Local or remote patch: fetches and hashes (evidence: `src/Downloader/ComposerDownloader.php`)
- Patches plugin → Patcher coordinator: applies patches (evidence: `src/Plugin/Patches.php`)
- Patcher coordinator → Patcher providers: discovers providers (evidence: `src/Patcher.php`)
- Patcher providers → Built-in patchers: provides patchers (evidence: `src/Capability/Patcher/PatcherProvider.php`)
- Patcher coordinator → Patcher contract: validates implementations (evidence: `src/Patcher.php`)
- Patcher coordinator → Installed dependencies: applies to path (evidence: `src/Patcher.php`)
- Patches plugin → Patch lock state: uses lock state (evidence: `src/Plugin/Patches.php`)
- Patches plugin → Command provider: registers commands (evidence: `src/Plugin/Patches.php`)
- Command provider → Environment doctor: provides command (evidence: `src/Capability/CommandProvider.php`)
- Command provider → Relock command: provides command (evidence: `src/Capability/CommandProvider.php`)
- Command provider → Repatch command: provides command (evidence: `src/Capability/CommandProvider.php`)
- Environment doctor → Patcher providers: checks patchers (evidence: `src/Command/DoctorCommand.php`)
- Relock command → Patch commands: extends commands (evidence: `src/Command/RelockCommand.php`)
- Repatch command → Patch commands: extends commands (evidence: `src/Command/RepatchCommand.php`)
- Patch commands → Patches plugin: accesses plugin (evidence: `src/Command/PatchesCommandBase.php`)
- Patches plugin → Plugin events: dispatches discovery events
- Patches plugin → Patch events: dispatches patch events (evidence: `src/Plugin/Patches.php`)
