Skip to content

Releases: arloliu/semantic-linefeeds

v1.0.0 — Stable contracts

Choose a tag to compare

@arloliu arloliu released this 22 Aug 10:58

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.ini settings
  • the --json document format
  • the suppression directives
  • the exit codes
  • the GitHub Action's inputs and outputs
  • the names you install by — the semlf package 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-on input says exactly what it accepts.
    It always took a comma-separated list of fused and wrap in 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 use

Full details in CHANGELOG.md.

v0.8.1

Choose a tag to compare

@arloliu arloliu released this 18 Aug 03:39

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, or whether is no longer flagged.
    Those words open a clause exactly as until, while, and because already did,
    so the line above one of them ends where it should.
    before and after were considered and deliberately left out:
    they open a clause and also work as ordinary prepositions,
    and exempting them would hide real column wraps like 4 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.
    In The 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 in al. 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

Choose a tag to compare

@arloliu arloliu released this 16 Aug 09:40

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 install publishes the semantic-linefeeds skill 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:
    which and is 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 setting OPENCODE_DISABLE_EXTERNAL_SKILLS hides 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 an exclude line on its own —
    it shows you the difference and asks.

  • /setup-semlf in 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, so semlf install opencode writes 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 opencode is what takes it,
    and nothing else does — including on a machine where you only ever used one of them.
    That is deliberate: semlf cannot 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,
    and semlf status now lists the skills too when no agent is left to read them.
  • semlf doctor now 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.
    doctor names 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, so semlf install opencode wants it gone —
    but semlf cannot 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 run semlf install opencode again.

v0.4.0

Choose a tag to compare

@arloliu arloliu released this 09 Aug 10:28

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 N flag and SEMLF_LONG_LINE env 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 to scripts/install.py.
    --repo/--home/--ref (or SEMLF_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 any tmp/ path component,
    so agent-generated scratch and prompt files pass untouched.