Mix aliases should only compose mix tasks. Shell tool orchestration
(shellcheck, fd) belongs in mise scripts. This removes the mix cmd
escape hatch and makes the boundary clear: mix.exs for pure mix
composition, scripts/ for cross-toolchain orchestration.
High priority:
- Auto-format on edit (.claude/hooks/format-elixir.sh): runs mix format
synchronously after every Edit/Write on .ex, .exs, and .heex files.
Ensures code is formatted before the next read or tool call.
- mix test permissions: added Bash(mix test) (bare) and Bash(mix test *)
(with path/flags) to the allow list. Previously only Bash(mix test:*)
was allowed, which didn't match common invocations.
- Slash commands: /precommit runs the full mix precommit pipeline and
reports failures with fix suggestions. /oban-status queries Oban job
state via Tidewave SQL, grouped by state and worker.
Medium priority:
- Chrome DevTools permissions: added 8 new tools (select_page,
list_network_requests, get_network_request, list_console_messages,
get_console_message, hover, press_key, wait_for) for debugging API
traffic, JS hook errors, hover states, and keyboard navigation.
- Gettext extraction hook (.claude/hooks/gettext-extract.sh): runs
mix gettext.extract --merge asynchronously after editing .heex files.
Async because it's project-wide and doesn't need to block the next edit.
- Sobelow permission: added Bash(mix sobelow:*) to the allow list for
independent security checks.
The upgrade surfaces a dependency problem that went unnoticed.
rustler_precompiled version 0.8.4 required castore, and that satisfied
the requirements for time_zone_info (which required the dependency
despite not listing it as such). With the upgrade to rustler_precompiled
0.9.0, castore is no longer listed as a dependency.
As it's still needed by time_zone_info, it's added to mix.exs. This
should have been done before, right when time_zone_info was added.
- Had to disable nonces for style-src directives (seems like they're not
propagated everywhere in oban_web's templates)
- Doesn't seem to support crons or workflows when backed by SQLite
Only meaningful difference with version 6 (which is required by swoosh)
is compatibility with old OTP versions. We don't care about that, so we
can try to upgrade.