Rust workspace that replaces bin/magento setup:di:compile with a faster pipeline while tracking Magento parity against archive truth:
- code truth:
generated/_code/ - metadata truth:
generated/_metadata/
- Generate Magento DI code (
generated/code) and metadata (generated/metadata) with parity-focused behavior. - Provide deterministic archive comparison outputs for regression detection.
- Keep iteration fast via parallel parsing, incremental writes, and persistent PHP reflection workers.
crates/cli(fast-di-compile): orchestration, phase pipeline, archive compare, reporting.crates/php-extractor: PHP class scanning + extraction (lexer/tree-sitter/PHP fallback).crates/di-xml-reader: DI XML discovery, parsing, and merge behavior.crates/di-resolver: interceptors/factories/proxies detection and argument resolution.crates/code-generator: PHP code + metadata serialization.crates/validator: output-vs-truth validation helpers..plans/: project planning, feature specs, and tickets.
- Rust toolchain (edition 2021)
- PHP CLI available (
phpor custom path via--fallback-php) - Magento source checkout (for
--magento-root)
From rust/di-compiler:
cargo fmt --all
cargo test --workspace
cargo check --workspaceIf generated/_code or generated/_metadata does not exist, create the baseline once from Magento:
cd /var/www/application
bin/magento setup:di:compile
mv generated/code generated/_code
mv generated/metadata generated/_metadataAfter this bootstrap, Rust compare mode uses these folders as source of truth.
cargo run -p fast-di-compile -- \
--magento-root /var/www/application \
--output /var/www/application/generated \
--jobs 8cargo run -p fast-di-compile -- \
--magento-root /var/www/application \
--output /var/www/application/generated \
--jobs 8 \
--compare-archive \
--archive-root /var/www/application/generated \
--compare-report-dir /var/www/application/generated/diffcargo run -p fast-di-compile -- \
--magento-root /var/www/application \
--output /var/www/application/generated \
--compare-archive \
--archive-root /var/www/application/generated \
--compare-report-dir /var/www/application/generated/diff \
--compare-fail-on-diffcargo run -p fast-di-compile -- \
--magento-root /var/www/application \
--output /tmp/rust-di-out \
--validate \
--php-generated /var/www/application/generated- Code:
generated/code/**/*.php - Metadata:
generated/metadata/*.php - Archive compare reports (
--compare-archive):generated/diff/summary.jsongenerated/diff/code.missing.txtgenerated/diff/code.extra.txtgenerated/diff/code.changed.txtgenerated/diff/metadata.missing.txtgenerated/diff/metadata.extra.txtgenerated/diff/metadata.changed.txt
When archive compare runs, normalized metadata artifacts are also generated:
generated/diff/comparable_metadata/comparable_<file>.archive.jsongenerated/diff/comparable_metadata/comparable_<file>.output.jsongenerated/diff/comparable_metadata/comparable_<file>_report.jsongenerated/diff/comparable_metadata/comparable_<file>_report.txtgenerated/diff/comparable_metadata/manifest.txt
Use *_report.txt first for triage (severity, top mismatch sections/type pairs, fix-category hints), then inspect the paired JSON files for exact content drift.
Magento DI behavior is split across:
- compile-time generation/scanning behavior (
setup:di:compileanalog) - runtime autoload-triggered generation behavior (Factory/Proxy/Interceptor conventions)
This project targets compile pipeline parity and uses generated/_code + generated/_metadata as the baseline oracle for convergence.
- Run compile with
--compare-archive. - Open
generated/diff/summary.json. - For metadata drift, inspect
generated/diff/comparable_metadata/*_report.txt. - Patch resolver/generator logic.
- Re-run and confirm counts drop.
- Planning index:
.plans/README.md - Ticket index:
.plans/.tickets/README.md - One execution slice per ticket; keep ticket status current when landing work.
Typical clean run on a 12-CPU dev box with ~18,800 PHP files and 570 di.xml files:
| Phase | Time |
|---|---|
| Phase 1+2 — PHP scan | ~830ms |
| Phase 3a/3b — di.xml parse | ~190ms |
| Phase 4–6 — detection + codegen | ~440ms |
| Phase 7 — metadata generation | ~1.0s |
| Total | ~2.4s |
Use --verbose to see per-phase and Phase 7 sub-step timing.
code_extra=3: three generated files differ from the PHP archive baseline (edge ordering cases).metadata_changed=16: key-ordering noise only; Magento runtime uses key lookup so there is no behavioral impact. Exact byte-for-byte parity is a known deferred item (TKT-034).- Composer-seeded module root discovery not yet implemented; falls back to
registration.phpDFS (TKT-035).
MIT License. See LICENSE.