The public API becomes a decision instead of an accident. @verbaly/compiler exported 132 names against the core's 41, and not one of them was documented anywhere: they had accumulated as whatever the first-party plugins happened to need, and at 1.0 every single one would have become a semver promise nobody had ever reviewed. This version reads the whole list against a written rule, publishes the 60 that survive it, documents them, and pins them with a test so the list can never grow by accident again. The same pin now guards the runtime's 41. Breaking (pre-1.0, tooling API only): 72 exports are gone from @verbaly/compiler and transformSource returns a different shape. Nothing in the runtime moved, no rendered output changed, and a project using the CLI or any first-party plugin needs no edits.
Highlights
- If you use the CLI or one of the framework packages, this release changes nothing for you. No config, no imports, no output. The whole version happens inside a package that only integrations reach into.
@verbaly/compilerfinally documents what you are allowed to import, in two layers: the types your own config file and your own translation provider need, and the toolkit for building an integration we do not ship. Everything else is now internal and says so.- The surface went from 132 names to 60, each one kept because a real integration imports it, because it is a documented extension point, or because a kept signature needs it. The 72 that survived none of those tests are gone.
- A bundler plugin no longer receives Verbaly's syntax tree. It used to get the whole parsed analysis just to pick two fields off it; now it gets the messages it found, as a plain catalog. That is one less thing that can break when the parser changes.
- Both packages now fail their own test if the surface grows, so adding a public name is a deliberate act a reviewer sees in the diff, instead of something that happens on the way to fixing something else.
For the full details of this release, see the repository changelog.