v0.3.4 — cspell-dict-report
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-reportIt 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, socoding-compound-ter*is unreadable either way.cspell dictionariesprints 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 underallowCompoundWords— 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-onlyoutput 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.