Skip to content

typos-format: opt-in config-gate makes the hook a silent no-op on zero-config repos, defeating the plugin's own auto-fix purpose #884

Description

@kyle-sexton

Lane: work (review-deferral exemption — finding surfaced against already-merged code, PR #872)

Triggering example: While comparing an independent parallel implementation (#880, closed as duplicate) against the merged plugins/typos-format/ from #872, found the hook only runs when the consuming repo already has a typos.toml/_typos.toml/.typos.toml/Cargo.toml ([*.metadata.typos])/pyproject.toml ([tool.typos]) file present. Without one, typos-format.sh exits silently via emit_skipped and never invokes typos at all — confirmed by reading the merged hook script and its own test suite (Case 1: opt-in gate OFF (no typos config) -> file left untouched).

Observed: The hook mirrors the ruff-format/biome-format opt-in-gate pattern (only activate if the consumer has already adopted a config for that tool). That pattern is correct for Ruff/Biome, which require project-specific configuration to be useful. typos is shaped differently:

  • typos ships a built-in spelling dictionary and runs standalone with zero configuration — its own documentation frames it as something to run unconditionally, not something a repo must first opt into via a config file.
  • Verified empirically against a real typos-cli 1.44.0 binary: typos <file> catches and fixes real typos (e.g. recievereceive) in a directory tree with no _typos.toml anywhere above it. A _typos.toml only widens the allowlist (extend-words/extend-identifiers/extend-ignore-re) and excludes ([files] extend-exclude) — it is not an activation switch.
  • The originating brief (docs/topics/lint-static-analysis-gaps/PLAN.md, item 1) frames this plugin's purpose as typos -w on the edited file — an unconditional auto-fix, matching markdown-format's existing pattern (which does not gate on a config file existing either).

Net effect: for any repo that hasn't already hand-authored a typos config — which is most repos on day one, i.e. exactly the audience this plugin is meant to help — the hook is a complete, silent no-op. This defeats the "auto-fix on edit, zero-config" goal the epic (#830) and its PLAN.md brief set out to close.

Expected: Drop the opt-in config-gate; run typos -w unconditionally on the edited file (matching markdown-format's existing unconditional pattern). typos's own file-anchored config discovery still applies automatically when a config IS present, for allowlist/exclude purposes — no functionality is lost by removing the gate, only the false negative on zero-config repos.

Category: behavioral (silently-wrong output on the plugin's primary use case)

Related: #872 (merged PR shipping the gap), #830 (epic), #880 (closed duplicate whose review surfaced this)

Metadata

Metadata

Assignees

Labels

automatedOpened by automation.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions