Skip to content

v0.3.4 — cspell-dict-report

Choose a tag to compare

@AndrewDongminYoo AndrewDongminYoo released this 25 Aug 09:52
· 55 commits to main since this release
65245a8

cspell-triage gets the bulk form it was missing.

Upgrade with claude plugin update repo-gate@cc-agents-kit, then restart open sessions.

Added — cspell-dict-report

The skill had a one-word verify (cspell trace <word>) and nothing for a whole lint run, so step 2 was guesswork over a log and step 4 required editing a scratch copy of the config.

cspell lint . --words-only --no-progress --no-summary | cspell-dict-report

It traces every unique word in one process and separates four things: words a dictionary knows as misspellings (with the correction it hands over), words an enabled dictionary already covers, unenabled dictionaries worth adding, and words nothing has.

The ranking is a greedy set cover, not a per-dictionary count. Each row is scored against the words the rows above it leave behind, so NEW is what enabling that dictionary actually buys. Overlap is the norm — a common word sits in twenty dictionaries — and a plain count credits the second dictionary for words the first already took. It is also what lets the report state that a dictionary is redundant and be right about it.

Run backwards, it prunes. cspell-dict-report --exclude custom-dictionary < .cspell/custom-dictionary.txt answers "if this dictionary did not exist, what would still be covered?" without editing anything: the covered section is what to delete, and the in-no-dictionary section is what the file is carrying its weight for. That is not cspell trace --no-dictionary, which leaves the row in place and only re-marks it.

Three ways cspell trace output misleads a parser

Each is handled, and each is pinned by a case in the suite:

  • The name column truncates at 20 characters and marks the truncation with a trailing * — the same character that marks a dictionary as enabled. Eight bundled names are long enough to collide, so coding-compound-ter* is unreadable either way. cspell dictionaries prints both columns in full and its default path format is byte-identical, so the join runs on the on-disk location and the name column is never parsed.
  • A compound hit renders as look•ahead. The dictionary holds the pieces, not the word, so it clears only under allowCompoundWords — which the configs this skill writes turn off. Counting it would overstate what enabling that dictionary buys.
  • A word carrying a separator is decomposed, each part traced under its own heading with the whole word's verdict on the first line. cspell's own --words-only output never contains a separator, so this surfaces only on a hand-written list.

There is deliberately no --config passthrough: cspell -c merges with the config the repo already has instead of replacing it, so a report built on one would describe a configuration that does not exist.

Changed

CI runs every plugins/*/bin/*.test.py rather than naming one suite — the new suite would otherwise have shipped outside the gate, which is the same shape 0.3.1 and 0.3.2 both corrected — and pins actions/checkout at v7.

Provenance

CREDITS.md gains rows for cspell-dict-report and for find-trunk-repos, which shipped in 0.3.1 with no entry.

Versions

repo-gate 0.1.4. guard-hooks 0.2.2 and context-handoff 0.1.2 are unchanged.