Skip to content
CAI
Software that uses CAICheck a score

com-lihaoyi/acyclic

55.6

Adequate · 20 September 2026

636

lines of production code

Scala

primary language

1

measurement over time

CAI band scale
CAI lens gauges

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.