NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
A pluggable static analysis framework for Dart and Flutter projects with an extensible runner, rule registry, and CLI.
Last release 4 months ago
29 May 2026
Too new to tell
only 1 release windows
Nearly every release is documented
notes for 9 of 9 stable releases
Nothing withdrawn
no release was ever pulled
4 months old
9 releases · first in 2026
One column per month.
cli: add --list-rules option to print registered rules
multi_file_analysis_context: add reportableFilePaths field
unused_function: normalise generic member identity in reference tracking
unused_class: make rule Dart 3 feature-aware
samples: add unused_source_file sample project
rules: avoid UnsupportedError on namePart in unused_class
### Bug Fixes * removed invalid version
New default-on unused_source_file rule. It flags Dart source files in the analyzed set that are never reached from any entry point via an import, expo
unused_source_file rule. It flags Dart source files in
the analyzed set that are never reached from any entry point via an
import, export, or part directive. Entry points are files under
bin/ or test/, files that declare a top-level main, and
lib/<package>.dart plus any other file sitting directly under
lib/ (i.e. not nested inside lib/src/). Generated-file basenames
such as *.g.dart and *.freezed.dart are skipped defensively even
when the runner's default excludes are turned off. Diagnostics are
emitted at Severity.warning. The rule is registered by the built-in
CLI and enabled automatically. Running dart run lintforge against a
project that previously produced no diagnostics may now surface new
warnings from this rule.MultiFileAnalyzerRule extension point for custom rules that need
to reason across multiple files in a single invocation (for example to
build an import graph or a cross-file symbol index). Multi-file rules
are registered with the same RuleRegistry as AnalyzerRule
implementations and are dispatched once per run with the full set of
resolved compilation units. Existing AnalyzerRule implementations
continue to be dispatched once per file and do not need any changes.--no-default-excludes CLI flag that opts out of the built-in
default exclude patterns. Pair it with explicit --exclude flags when
you want full control over which paths are skipped.LintforgeOptions.defaultExcludePaths constant exposing the list of
glob patterns excluded by LintforgeOptions.defaults(). Useful when
composing custom LintforgeOptions instances programmatically.unused_function rule. It flags file-local function
declarations that are never referenced, specifically private top-level
functions in libraries that have no part files and local function
declarations inside another function or method body. Diagnostics are emitted
at Severity.warning. The rule is registered by the built-in CLI and enabled
automatically. Running dart run lintforge against a project that previously
produced no diagnostics may now surface new warnings from this rule.unused_class rule. It flags file-local declarations
that are never referenced within the same compilation unit, covering
class, mixin, enum, and extension type declarations whose names
begin with _. The rule only runs against libraries that have no
part files and skips declarations annotated with
@pragma('vm:entry-point'). Diagnostics are emitted at
Severity.warning. The rule is registered by the built-in CLI and
enabled automatically. Running dart run lintforge against a project that
previously produced no diagnostics may now surface new warnings from
this rule..pubignore to keep automation and assistant-only files out of the published
package archive..gitattributes for predictable text file line endings.>=9.0.0 <13.0.0 so projects using
freezed >=3.2.5 can add lintforge without a version-solver conflict.*.g.dart and *.freezed.dart.
Pass an empty excludePaths (or --no-default-excludes on the CLI)
to opt out.--exclude now layers on top of the default excludes instead of
replacing them. Patterns you pass are added to the built-in defaults;
use --no-default-excludes if you need to suppress the defaults.lintforge is now installable alongside freezed ^3.2.5.dart run lintforge --version now prints the correct package version
instead of the stale hardcoded 0.1.0.unused_class rule.
The rule previously reached into ExtensionTypeDeclaration.primaryConstructor,
which only exists in analyzer 10+, causing a build break for consumers
pinned to analyzer 9.0.0 ('primaryConstructor' isn't defined for the type 'ExtensionTypeDeclaration'). The rule now uses the cross-version
ExtensionTypeDeclaration.name accessor.unused_class no longer crashes on analyzer 9.x/10.x. The rule
previously read ClassDeclaration.namePart and
EnumDeclaration.namePart, which require the default-off experimental
flag useDeclaringConstructorsAst = true and otherwise throw
UnsupportedError, surfacing as
Rule unused_class threw during analysis: .... The rule now uses the
always-available name token on both nodes.Added a pluggable static-analysis framework for Dart and Flutter projects:
AnalyzerRule: abstract plugin contract for custom rules.Diagnostic, Severity, SourceLocation: value types describing
analysis findings.AnalysisContext: carrier passed into each rule invocation, exposing the
resolved compilation unit.RuleRegistry: in-memory registration and lookup of rules, with
duplicate-id rejection.AnalysisRunner: orchestrator that resolves target files, dispatches
rules, and collects diagnostics.LintforgeOptions: value class describing include/exclude paths and enabled
rule ids.Reporter / ConsoleReporter: pluggable diagnostic output, with a stdout
implementation.lintforge (dart run lintforge) with --help, --version,
--rules, and --exclude flags.Calculator stub that shipped in 0.0.1. Consumers that
depended on it must remove the import; it was a generator placeholder and
not part of any intended public API.Your coding agent can read these notes before it upgrades. Set up the MCP server →