D-Powered Rule Engine

Migrate source code
without the friction.

≡quivalence is a version-aware adaptation ecosystem that automatically resolves, maps, and rewrites source code and cross-OS paths using lightweight SDL rulesets.

equivalence-engine --run
$ equivalence-engine -p ./src \
  --from 5.15 --to 6.0 \
  --library python/PyQt

[info] Resolving migration path...
[path] PyQt 5.15 -> PyQt 6.0 (1 step)
[info] Applying 5.15-6.0.sdl rules...
[done] 42 files refactored in 18ms.

The Ecosystem Repositories

A modular suite of libraries, rulesets, actions, and tools working in perfect unison.

⚙️

equivalence-engine

The core D-based compiler and CLI binary. It analyzes files, fetches remote/local rulesets, maps dependency pathways, and transforms files in-place or into output directories.

View Engine Docs →
🔄

equivalence-engine-action

A modular and reusable GitHub Action. Automate migrations, API updates, or platform adaptation in your CI pipelines with full pinning capabilities.

View on GitHub →
📦

libequivalence

The core D-library underpinning the engine. Incorporate path resolution, SDL parsing, and text replacements natively into your own custom D tools and compilers.

View on GitHub →
📝

equivalence-rules-code

The official code adaptation rules repository. Includes comprehensive SDL patterns for migrating libraries, such as PyQt5 to PyQt6 class and module translations.

View on GitHub →
📁

equivalence-rules-filesystem

A dedicated domain ruleset mapping abstract system directories (`lib_dir`, `config_dir`) into literal concrete paths across Linux, Ubuntu, macOS, and Windows.

View on GitHub →

Adaptation Sandbox

Experience the rule engine in real-time. Choose a migration and watch how code and paths dynamically refactor.

PyQt5 to PyQt6 Migration
Original Content
# Loading imports from PyQt5
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction
from PyQt5.QtCore import Qt

app = QApplication([])
window = QMainWindow()
action = QAction("&Exit", window)
action.setShortcutContext(Qt.WindowShortcut)
Adapted Output
# Loading imports from PyQt5
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction
from PyQt5.QtCore import Qt

app = QApplication([])
window = QMainWindow()
action = QAction("&Exit", window)
action.setShortcutContext(Qt.WindowShortcut)

Install the CLI

Get the Equivalence CLI installed on your local workstation in seconds.

winget install AMDphreak.EquivalenceEngine
brew tap AMDphreak/homebrew-tap
brew install equivalence-engine