What
mise run lint:shell fails immediately without checking a single file:
[lint:shell] $ find . -name "*.sh" -not -path "./node_modules/*" -exec shellche…
find: -exec: no terminating ";" or "+"
[lint:shell] ERROR task failed
The task in private_dot_config/mise/config.toml.tmpl (and the rendered
~/.config/mise/config.toml, line 342) is:
run = 'find . -name "*.sh" -not -path "./node_modules/*" -exec shellcheck {} \;'
The single-quoted TOML literal keeps both backslashes, so find never sees a
bare \; or + terminator.
Why it matters
mise run lint aggregates the sub-linters, so the shell tier is silently
contributing nothing. .claude/rules/testing.md lists mise run lint:shell as
the tier to run after modifying shell scripts — it has not actually been running
shellcheck. The repo's pre-commit shellcheck hook still covers staged files, so
this is a gap in the local tier, not in CI.
Repro
Fix sketch
Either drop one level of escaping (-exec shellcheck {} \;) or switch to
-exec shellcheck {} +, which is also one process instead of N. Verify with a
deliberately broken script that the task actually reports it — an exit 0 on a
sweep that checked zero files looks identical to a clean run.
Provenance
Found while verifying #397; the same line is present on
main, so it is not a regression from that branch.
What
mise run lint:shellfails immediately without checking a single file:The task in
private_dot_config/mise/config.toml.tmpl(and the rendered~/.config/mise/config.toml, line 342) is:The single-quoted TOML literal keeps both backslashes, so
findnever sees abare
\;or+terminator.Why it matters
mise run lintaggregates the sub-linters, so the shell tier is silentlycontributing nothing.
.claude/rules/testing.mdlistsmise run lint:shellasthe tier to run after modifying shell scripts — it has not actually been running
shellcheck. The repo's pre-commit
shellcheckhook still covers staged files, sothis is a gap in the local tier, not in CI.
Repro
Fix sketch
Either drop one level of escaping (
-exec shellcheck {} \;) or switch to-exec shellcheck {} +, which is also one process instead of N. Verify with adeliberately broken script that the task actually reports it — an exit 0 on a
sweep that checked zero files looks identical to a clean run.
Provenance
Found while verifying #397; the same line is present on
main, so it is not a regression from that branch.