Repository navigation
iyi 0.5.0
The language got its editor, and a panic stopped being a process.
0.4.0 made iyi concurrent and machine-readable; this release makes it a
language you can live in.
iyi lsp grew from a first session into a server that stands
feature-for-feature beside gopls, and every capability is asserted, not
narrated:
| diagnostics | pushed on every keystroke from a real compile — 36 ms p50 / 55 ms p95 across the sample corpus — and pulled on request, one file or the whole workspace: an agent asks a question instead of sitting on a subscription |
| completion | fuzzy-ranked, and it writes the import/using pair it knows you forgot — in a buffer that has never compiled, because pub is a parse-time fact |
| references / rename | workspace-wide off the typed graph: a caller in a file nobody opened is found, edited, and named — and a rename reaches the using line that selects the old name |
| moving a file | is renaming the module (IV.6): one WorkspaceEdit rewrites the header and every consumer before the rename lands |
| the call graph | call hierarchy both ways, trait implementations, type hierarchy, and a code lens that runs the module over the wire and returns what it printed |
| highlighting | semantic tokens from the lexer — no editor needs a grammar for .iyi — with deltas, and an 8,000-token word-boundary sweep in CI so a colored word is a whole word |
| the transport | forgives garbage frames, non-JSON and non-UTF-8 bodies; a rebuilt binary under a running session no longer lobotomises it; a cancel overtakes queued work and a typing burst coalesces into one compile |
editors/ makes it installable: a three-file VS Code client (a
deliberately minimal grammar paints the first frame; the server's tokens
are the truth and override it), with one-stanza configs for Neovim,
Helix and Sublime beside it. Five gates hold the server on every push:
a 49-step scripted session, per-verb latency budgets, the word-boundary
sweep, a transport soak, and the doc-numbers sweep that keeps every
stated figure honest.
And panics landed the way III.1.4 always wanted them: a panic kills
the task, not the process — and the unwind owns no unwinder. defer
registers its cleanup on a per-task list the panic path walks, so the
promise holds with no landing pads, no personality function, no libgcc:
the dependency floor never moved, and a defer is priced at ~16 ns,
budgeted in CI. A panicking task drains its defers innermost-first, its
group cancels the siblings and re-raises once in the owner; main exits 1
after its own drain; an arithmetic overflow dies at the same boundary;
.or_panic became a real panic by its lowering not changing at all.
The AI_FIRST menu this cycle opened with closed 8-for-8, iyi vet
closed III.8's table the way the row was written ("a verb, not new
analysis"), and the rebuild benchmark ran and corrected its own
prediction — the honest finding is recorded in SPEC.md rather than
tuned away.
.iyimod format is unchanged at 41. Released artifacts carry the
version alone, so a 0.4.0 artifact is rejected by a 0.5.0 build and
rebuilt, never migrated.
The tarball is relocatable: extract, put bin on PATH, and
iyi run, iyi lsp, iyi vet work with nothing to configure.