Custom Credo checks targeting anti-patterns that LLMs commonly produce.
Stock Credo ships checks for filter |> filter, reject |> reject,
map |> join, map |> into, etc. but not the cases where one operation
composes with the complementary one, nor the common map-building,
sort-then-pick, and map-shape normalization anti-patterns. These checks fill
those gaps.
Two-pass Enum chains (suggests Enum.reduce/3)
ForgeCredoChecks.FilterMap:Enum.filter |> Enum.mapForgeCredoChecks.RejectMap:Enum.reject |> Enum.mapForgeCredoChecks.MapReject:Enum.map |> Enum.rejectForgeCredoChecks.MapRejectNil:Enum.map |> Enum.reject(&is_nil/1)
Hand-rolled map building (suggests Map.new/2)
ForgeCredoChecks.MapNewFromInto:Enum.into(%{}, fn ...)ForgeCredoChecks.MapNewFromReduce:Enum.reduce(_, %{}, &Map.put(acc, k, v))
Wasteful list-extremum patterns
ForgeCredoChecks.ReverseListFirst:xs |> Enum.reverse() |> List.first()becomesList.last(xs)ForgeCredoChecks.SortListFirst:Enum.sort \| List.firstbecomesEnum.min/Enum.max/*_by
Map shape normalization
ForgeCredoChecks.MapGetWithOr:Map.get(_, _) || fallbackForgeCredoChecks.ChainedMapGet:Map.get(_, _) || Map.get(_, _)
LLM tells
ForgeCredoChecks.NoInlineRegex: inline~r/~Rregex sigils inside function bodiesForgeCredoChecks.NoAnyOrTermTypes:any()/term()in specs, callbacks, and type definitionsForgeCredoChecks.MultilineStringConcat: multi-line string-literal<>concatenation (use a heredoc)
Architecture and test discipline
ForgeCredoChecks.OneModulePerFile: everydefmoduleafter the first in a source file (test files excluded by default)ForgeCredoChecks.TaintedSourceInspection: source-grep constructs applied to text read from non-test.ex/.exsfilesForgeCredoChecks.TimingAndPrivateStateGuard:Process.sleep/1and:sys.replace_state/2call nodesForgeCredoChecks.NoApplicationGetEnvInLib:Application.get_env/2,3insidelib/(usecompile_envorfetch_env!instead)ForgeCredoChecks.TelemetryControlFlow::telemetry.attach/attach_manywith an inline handler that performs control flow (send,GenServer.call/cast) instead of observation-only recording