Releases: arloliu/semantic-linefeeds
Release list
v1.0.0 — Stable contracts
The first stable release.
Nothing new to learn — this release is a promise about what will not change.
A compatibility guarantee
The surfaces you build against are now stable under semantic versioning:
- the command-line modes and flags
- the
.semlf.inisettings - the
--jsondocument format - the suppression directives
- the exit codes
- the GitHub Action's inputs and outputs
- the names you install by — the
semlfpackage and command, the pre-commit hook id, the Claude plugin name
all on Python 3.9 or newer.
A change that would break any of them now costs a major version;
new capability arrives in minor versions.
Two things deliberately stay flexible:
which lines draw findings (precision keeps improving between majors),
and the wording of messages — the text is for people, the structure is for tools.
Every exit code, documented in one place
The README now carries a mode-by-mode table of what 0, 1, 2, and 64 mean,
including the two deliberate choices in it:
a hook exits 0 on a payload it cannot read,
because a hook must not block your editing on its own malfunction,
and render exits 0 however many findings it renders,
because what a finding means for a build is the gate's decision.
Changed
- The Action's
fail-oninput says exactly what it accepts.
It always took a comma-separated list offusedandwrapin either order,
with duplicates and stray whitespace tolerated;
now its description and error message say so, and tests hold them to it.
Fixed
- The detector reference caught up with the checker.
The specification now documents the option that names why a suggestion was withheld,
and the field it adds when asked.
Install
uv tool install semlf # or: pipx install semlf / pip install semlf
semlf install # wire up the agents you useFull details in CHANGELOG.md.
v0.8.1
The checker stops accusing five kinds of correct line, and stops hiding work on two others.
Fixed
- A line ending in Chinese punctuation is no longer read as unterminated.
A line closing on。or,counted as a severed clause,
so an English line beneath it was flagged on correct text.
Mixed Chinese-English prose puts that boundary in ordinary paragraphs.
This is not Chinese support: no check reads Chinese, it only stops accusing text it never understood. - A break before
since,once,whereas,whenever, orwhetheris no longer flagged.
Those words open a clause exactly asuntil,while, andbecausealready did,
so the line above one of them ends where it should.
beforeandafterwere considered and deliberately left out:
they open a clause and also work as ordinary prepositions,
and exempting them would hide real column wraps like4 LE bytes right/after it. - A long-line advisory now measures the sentence, not the indentation.
A 68-character comment nested deep inside a struct drew an advisory telling you to split it at column 120.
Indentation and the comment marker no longer count toward a sentence's length. - A line holding several run-on sentences now reports every one of them.
It used to surrender them one per pass,
which is indistinguishable from a finding that survived a repair,
so a fix could stop with the line still run on. - A repeated phrase almost never costs a finding its position now.
When the same sentence appeared twice on a line,
the checker could not say where the problem was and withheld the finding from editor feedback entirely.
One shape still defeats it:
a one-line block comment whose text also appears in code beside it on the same line. - A citation is no longer read as two sentences.
InThe Smith et al. Nature paper argues otherwise.the period closes the citation, not the sentence,
and the checker blocked the line it appeared on.
A sentence that genuinely ends inal.now goes unreported instead,
which is the trade this checker prefers: a missed line costs less than a wrong accusation. - Text inside a Python multi-line string is no longer read as a comment.
A#-led line inside an assigned triple-quoted string or f-string was checked as prose,
so a string holding sample text or a template could block the edit that wrote it.
A suppression directive written inside such a string no longer reaches the line below it either.
Docstrings are unaffected and are still checked.
Other languages do not yet have this: a comment marker inside their multi-line strings can still be misread.
Added
- An over-long line now always says so, even when the checker cannot suggest where to break it.
It used to report nothing in that case, which was indistinguishable from approval.
That mattered most right after repairing a column-wrapped comment:
you rejoin the severed lines as asked, the result runs past the limit,
and the tool went quiet on a line that still needed splitting.
The new message says plainly that no boundary was recognized,
that the checker's word list is short rather than complete,
and that leaving the line long is the right answer when it genuinely has nowhere to break.
Documentation
- The suppression directive is shown in every language that supports it,
not only in Markdown. - The scope note says plainly that Chinese, Japanese, and Korean prose is passed over rather than checked,
so a clean run over it is silence rather than approval. - The repair guidance for a severed clause is bound to the two lines the finding covers,
which settles the old conflict between rejoining a clause and never reflowing text you did not write.
v0.8.0
One skill now serves both Codex CLI and opencode, published once to the directory they already share.
A setup skill lets you ask an agent to install semlf instead of doing it by hand.
Added
-
One skill, read by both Codex CLI and opencode.
semlf installpublishes thesemantic-linefeedsskill once, into~/.agents/skills,
and both agents load it from there — no second copy, and no per-agent copy to keep in step.
opencode had none at all before this release:
it got the checker and the plugin, and its hook then told the model to go read a skill nobody had installed for it.
It now acts on the same advice Codex does:
whichandis a real clause boundary, what never to break, and when to stop and ask you.
opencode 1.18.18 or newer is needed to see it,
and settingOPENCODE_DISABLE_EXTERNAL_SKILLShides it from opencode entirely. -
A setup skill, so you can just ask your agent to install
semlf.
Ask Claude Code, Codex CLI, or opencode to "install semlf",
and it now follows a fixed procedure instead of guessing at package names or editing your config by hand.
It installs the CLI if it is missing, repairs an install that went stale after an upgrade,
and offers to write the project's.semlf.ini.
It shows you every command before running it,
and it will not overwrite one of your files or add anexcludeline on its own —
it shows you the difference and asks. -
/setup-semlfin opencode.
opencode offers skills to the model and commands to you,
so the same procedure is installed both ways and you can start it yourself by typing the command.
Changed
- Installing for opencode alone now also writes the checker and the README to the shared install location.
They used to arrive there only when you installed for Codex CLI;
installing for opencode alone put a second checker beside its plugin instead.
The skill points at both, sosemlf install opencodewrites them even on a machine that never had Codex CLI. - The skill is removed only when you ask for both agents by name.
One copy now serves both agents, so uninstalling one of them leaves it in place for the other.
semlf uninstall codex opencodeis what takes it,
and nothing else does — including on a machine where you only ever used one of them.
That is deliberate:semlfcannot always see a Codex you installed somewhere unusual,
and it would rather leave you a file you can delete than delete one you were still using.
The checker and the README are always kept, as before,
andsemlf statusnow lists the skills too when no agent is left to read them. semlf doctornow looks inside opencode's own skills folder.
A skill file sitting there usually wins over the shared one,
so opencode would quietly answer with it instead.
doctornames the file rather than passing the machine as healthy.- A skill file you put in opencode's skills folder yourself is now refused, not replaced.
The old by-hand instructions told you to copy the skill into~/.config/opencode/skills/.
That copy competes with the one shared skill, sosemlf install opencodewants it gone —
butsemlfcannot tell your file from one it wrote, and it will not delete a file it cannot account for.
It stops and names the path instead of touching it.
If you set opencode up by hand, this is the first thing you will hit rather than a corner case:
move that file aside, then runsemlf install opencodeagain.
v0.4.0
Added
- Ten new comment languages:
VB.NET, SQL, Lua, Ruby, Perl, PowerShell, R, Haskell, Elixir, and Zig,
plus new C-family extensions
(Kotlin, Swift, Scala, Dart, Objective-C, PHP, Groovy/Gradle). - Configurable long-line advisory threshold:
--long-limit Nflag andSEMLF_LONG_LINEenv var, 0 disables;
default stays 120. install.sh: a curl-able POSIX bootstrapper.
It clones or updates a checkout under${XDG_DATA_HOME:-~/.local/share}/semantic-linefeeds,
then hands the remaining arguments toscripts/install.py.
--repo/--home/--ref(orSEMLF_REPO/SEMLF_HOME/SEMLF_REF)
override the clone source, checkout location, and pinned ref for mirrors and reproducible installs.- README rewritten around the install story:
the curl one-liner leads,
every adapter row links to its install guide,
and a private-network path (mirror via--repo/SEMLF_REPO,
Claude Code via a private marketplace remote) is documented.
Fixed
- Hook mode no longer flags files under the platform temp directory
or anytmp/path component,
so agent-generated scratch and prompt files pass untouched.