com-lihaoyi/acyclic
55.6
Adequate · 20 September 2026
636
lines of production code
Scala
primary language
1
measurement over time
What this system is
This system is a Scala compiler plugin designed to detect and prevent cyclic dependencies in codebases. It provides graph analysis algorithms to identify cycles and strongly connected components, enforcing acyclic structures during compilation. The tool supports both Scala 2 and Scala 3 versions and includes comprehensive test infrastructure to validate its cycle detection logic.
Features
Acyclic compiler plugin ported to support Scala 3
The acyclic compiler plugin has been ported to support Scala 3 (including versions 3.4.x and 3.5.0) while maintaining compatibility with Scala 2.11, 2.12, and 2.13. The codebase is now organized into version-specific source directories (\src-2\ for Scala 2 and \src-3\ for Scala 3) with shared logic in \src\ and compatibility shims in \src-2.11\, \src-2.12\, and \src-2.13\. The plugin now uses the \dotty.tools.dotc\ compiler internals for Scala 3 and \tools.nsc\ for Scala 2, allowing users to enforce acyclic dependencies in both Scala 2 and Scala 3 projects.
acyclic · high confidence
Removals
Removal of 'sinject' Scala compiler plugin
The 'sinject' plugin, which previously injected implicit parameters into classes marked with the @sinject.Module annotation, has been removed from the codebase. This change eliminates the automatic modification of class constructors and templates during the compilation phase, meaning users will no longer receive implicit binding module injections via this compiler extension.
plugin/src · high confidence
Removal of the sinject Module annotation class
The \Module\ annotation class, previously defined in \plugin/src/sinject/Runtime.scala\, has been removed from the plugin. This eliminates the \sinject.Module\ type that users could apply to their code to mark modules for dependency injection.
plugin/src/sinject · high confidence
Behavioural changes
Migrate build system to Mill 1.0.5 and update tooling
The project has migrated its build system from SBT to Mill, now using version 1.0.5 (specified in .mill-version). The build configuration is now defined in build.mill, which sets up cross-compilation for Scala versions 2.11 through 3.8 and configures publishing to the Sonatype Central Portal. The Java runtime requirement is explicitly set to Temurin 17 via .mill-jvm-version. Additionally, scalafmt has been updated to version 3.8.1 with a new configuration file (.scalafmt.conf) that enforces Scala 3 dialect for .mill files and src-3 sources, and the MIT license file has been added to the repository.
(repo-wide) · high confidence
New graph analysis logic for cycle detection
The repository now includes a new GraphAnalysis module that provides algorithms for detecting cycles and strongly connected components within dependency graphs. This logic, implemented in GraphAnalysis.scala, supports finding the smallest cycle starting from a specific node and identifying strongly connected components via depth-first search, which are core capabilities for the acyclic plugin's functionality.
repository · high confidence
Test coverage
Added test infrastructure for cycle detection validation; Removed obsolete test source files.
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 56.
Lenses
- Code Health 98
- Architecture 69
- Maturity 45
- Readiness 57
- Security 70
Changes since last survey
- 256 commits — 249 feature/other, 7 fixes
By area
- (root) — 147 commits
- (repo) — 22 commits
- test/resources — 20 commits
- src/test — 14 commits
- plugin/src — 11 commits
- acyclic/test — 10 commits
- src/main — 8 commits
- .github/workflows — 6 commits
- test/src — 6 commits
- acyclic/src — 3 commits
- acyclic/src-3 — 2 commits
- project/target — 2 commits
- target/scala-2.10 — 2 commits
- acyclic/src-2 — 1 commit
- project/build.sbt — 1 commit
- project/project — 1 commit
Notable commits
- fix: Converted readme to Asciidoc and fixed links
- fix: Fix Java classpath retrieval in tests (#158)
- fix: Fix back publishing via Github Workflow: pass SCALA_VERSION env var to job (#168)
- fix: Fix repository name in build.sc (#39)
- fix: before trying to fix classpath
- fix: fixed acyclic package identification
- fix: fixed gitignore
- change: .
- change: .gitignore is now working
- change: 0.1.3
- change: 0.1.4
- change: 0.1.5
- change: 0.1.6
- change: 0.1.7
- change: 0.2.0
- change: 0.3.13
- change: 0.3.14
- change: 0.3.15
- change: 0.3.17
- change: Add Support for Scala 3.8.3 (#178)
- …and 236 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
com-lihaoyi/acyclic was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 7c886c778b7c566a130b2ddfb8b6b400055170c9 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-b51f968c9b10.