Repository navigation
Releases: BotMakerDev/botmaker-cli
Release list
v0.4.0
Build
- JavaFX 27 (2026-10-18), from 25.0.4, the contract's version; compile-only, as before.
Added
- The validator knows a set of nested classes (contract
ofClasses, 2026-10-16): such a set passes when its
classes' setup type is one a host writes, and a part of its field type (or of its element, when referred to by
name) counts as writable, since the host writes it as a reference (Screens.MARKET.beerBuy). botmaker mcp-bridge: Studio's MCP tools over stdio, across Studio's restarts. An MCP client configured
with Studio's HTTP endpoint marked it failed each time Studio stopped, until the user reconnected it by hand.
The bridge is the client's server for its whole session: it reads Studio's port and token from Studio's
mcp.json, forwards each call while Studio runs, answers that Studio is not running while it does not, and
sendsnotifications/tools/list_changedwhen Studio comes back or restarts. Claude Code:
claude mcp add botmaker-studio -- botmaker mcp-bridge.- The bridge checks it talks to Studio before it sends the token. A process that took Studio's port while
Studio was down is asked for/mcp-hello's proof first and gets no token. - start_studio starts Studio from the bridge while it is down:
--studio <command>($BOTMAKER_STUDIO), or
--umbrella <dir>($BOTMAKER_UMBRELLA) for a dev Studio run by Maven. Its output goes to Studio's cache,
studio-run.log. The tool is listed whether Studio runs or not.
v0.3.6
Fixed
--gamebotmakes its tag a GitHub Release, which is what New Project copies. Tags alone left the
template's latest release at v0.1.1 (SDK 1.2.3) through v0.2.7.
Removed
- A release opens no plugin-registry pull request. Moving a released plugin's
verifiedVersionwaited on the
registry's gate, and the ones for SDK v1.4.3 and v1.4.4 failed it and sat unmerged. Studio installs a plugin
at JitPack's newest build instead.
v0.3.5
Fixed
--gamebotpins the SDK's newest tag, or the SDK the run cuts, and is released when its tag pins an older
one. Its gate compiles it at that tag and names--sdkwhen itsmainneeds SDK code no release has.
Removed
- A gallery entry has no
requires.bot publishno longer writes the plugins a bot's pom declares, and the
gallery gate no longer checks them: the copy went stale at the repository's next release (gamebot's said SDK
1.2.3 while v0.2.7 pinned 1.4.4). Studio reads them off the release's pom. An old entry'srequiresis read
past and dropped from the catalog.
v0.3.4
Fixed
- A release refuses a tag that would pin a release JitPack never built.
PinsResolveGateasks JitPack for
every pin a cut module's tag carries on an upstream outside the release, and names the flag to add. On
2026-10-12 SDK v1.4.3, Studio v1.4.3 and dashboard v0.3.1 were cut pinning botmaker-shared v0.2.4, which never
built, and all three were broken for good. - A release refuses a module that does not compile against the releases its tag pins.
BuildsAtPinsGate
compiles a clean worktree of the module with every upstream outside the release pinned to its newest tag, and
quotes the compiler. SDK v1.4.3 called a shared method no shared release had; CI, building against shared's
main, was green. - Releasing shared forces the dashboard, which pins it; every pin is a forcing edge now, which a test derives
from the modules' pins. - A module whose tag would pin a newer upstream is released when named, not skipped as "only docs": its
published pom differs (ChangeKind.pinsMove). - A gate whose Maven run could not find an upstream's
-SNAPSHOTin~/.m2skips with the install command
instead of refusing the module: the redirect-pointer, plugin, template and builds-at-pins gates all read the
failure throughMissingSnapshot. It also names the missing artifact, not the project Maven was building, and
reads a miss Maven cached ("was not found in … during a previous attempt"). --no-wait-jitpackstops before tagging on top of an upstream JitPack already failed to build, asked once
per upstream this run tagged.
v0.3.3
Added
JitpackScriptGate: a release refuses a JitPack module whose.jitpack/build.shorstatx.cdiffers
from the umbrella'stools/jitpack/or is not committed, or whosejitpack.yml's install does not start
with it (--forceoverrides).- A JitPack failure names a rate limit. When the build log shows Maven Central's
429 Too Many Requests,
the release's error says so: a rate limit on JitPack's builders, not the module.
Changed
GatePlan.JITPACK_MAVENis 3.9.9, the Maven every JitPack build now runs, soJitpackPluginsGateholds
plugin prerequisites to it, falling back to JitPack's own 3.6.1 for a module whose script gate was forced or
skipped.
Build
- JitPack builds with
.jitpack/build.sh, the umbrella'stools/jitpack/build.sh: Maven 3.9.9 and every
dependency from Google's mirror of Maven Central first, with backoff and Maven's 429 retry, so Central's
429 Too Many Requestsno longer loses a tag. The statx shim comes with it.
v0.3.2
Added
-
plugin validate'svalue-typescheck reads a deprecated type'sreplacedBy(): it refuses a pointer on a type
whose class is not@Deprecated, one naming the type itself or another deprecated type, one on a type that is
neither a call nor an enum (nothing to map), one naming an enum for a call or a call for an enum (Studio pairs
only like with like), and one naming a type no plugin on the classpath lists in
types()(compared by name); a@Deprecateddeclared type with no pointer passes with a note. -
plugin validatereads a plugin's own parameters (ManagedValue.param). It checks that a generic one starts
as a value of its type. -
A plugin may change a managed value's shape between releases. Nothing checks it against the previous
release: Studio's upgrade repairs a bot's values like the rest of its code.
Fixed
plugin validate'stypescheck accepts aClass<…>part when a loaded plugin declares a grouped open set
(ofEnums(…).groupedAs(…)) whose element fits it: the host writes it as a class literal of one of the bot's
nested enums (Activities.Collect.class). It refused the SDK'sFlow.activity(Activities.Collect.class, …),
which stopped a release at the SDK's validation gate.
No source changes since v0.3.0; re-released for updated upstream pins.
Changed
plugin validate'smanagedcheck takes typed ids only (ManagedValue.method(SdkValue.Id.FLOW)), as
the contract now does: their spelling is the enum's, so the lowercase-words pattern for string ids is gone.
Two declarations of one id still fail.plugin validate'stypescheck knows withers: a call's factory is checked against the parts before the
withers', and each wither's argument must be a type a host writes.- A release whose push fails says what git said, and still moves the pins of that module's dependents and
records its pointer: its tag and back-to-snapshot commit are local by then. Before, the dashboard kept
pinning a cli snapshot nobody built, and every later release was refused over it.
Added
botmaker release --sync-pinsmoves everybotmaker.*.versiononmainto its upstream'smainversion
— what the versions gate refuses, which now names the command — one commit per pin, plus the umbrella
pointer commit. Previews unless--execute; pushes nothing.
v0.3.1
No source changes since v0.3.0; re-released for updated upstream pins.
Changed
plugin validate'smanagedcheck takes typed ids only (ManagedValue.method(SdkValue.Id.FLOW)), as
the contract now does: their spelling is the enum's, so the lowercase-words pattern for string ids is gone.
Two declarations of one id still fail.plugin validate'stypescheck knows withers: a call's factory is checked against the parts before the
withers', and each wither's argument must be a type a host writes.- A release whose push fails says what git said, and still moves the pins of that module's dependents and
records its pointer: its tag and back-to-snapshot commit are local by then. Before, the dashboard kept
pinning a cli snapshot nobody built, and every later release was refused over it.
Added
botmaker release --sync-pinsmoves everybotmaker.*.versiononmainto its upstream'smainversion
— what the versions gate refuses, which now names the command — one commit per pin, plus the umbrella
pointer commit. Previews unless--execute; pushes nothing.
v0.2.0
No source changes since v0.1.4; re-released for updated upstream pins.
No source changes since v0.1.3; re-released for updated upstream pins.
Changed
-
A release of
--sdkor--plugin-basicsopens a pull request onbotmaker-plugin-registrymoving that
plugin'sverifiedVersionto the new tag, and the registry's gate runs over it there. Studio installs a
ticked plugin at that version, and nothing moved it afterplugin publish, so New Project offered SDK
v1.1.7 and basics v0.0.1. A pull request that cannot be opened warns; the release is not failed. -
plugin validate'svalue-typescheck walks every part a component type's factory declares, through the
host's containers to each leaf, and fails a part no host could write —part 0 (java.util.List<p.Step>) holds p.Step, which no loaded plugin declares. The fresh-value round trip alone passed a type whose fresh
value held empty lists, and the first filled one was a value Studio silently could not write. -
plugin validate'smanagedcheck judges an open set's element type (openSet(id).of(E.class)): a class
no loaded plugin declares fails, since no host could write a constant of it. -
A
--studio-apirelease moves Studio'sCONTRACT_FALLBACK_VERSIONto the contract tag it cuts, as
--sdkmovesSDK_FALLBACK_VERSION, and the fallback gate refuses a Studio release whose constant names
no published contract tag. -
Built against
botmaker-studio-api0.4.0 andbotmaker-plugin-host0.2.2:plugin validatereads a palette
with no@Palette.order, which that contract release deleted.
v0.1.4
No source changes since v0.1.3; re-released for updated upstream pins.
Changed
-
A release of
--sdkor--plugin-basicsopens a pull request onbotmaker-plugin-registrymoving that
plugin'sverifiedVersionto the new tag, and the registry's gate runs over it there. Studio installs a
ticked plugin at that version, and nothing moved it afterplugin publish, so New Project offered SDK
v1.1.7 and basics v0.0.1. A pull request that cannot be opened warns; the release is not failed. -
plugin validate'svalue-typescheck walks every part a component type's factory declares, through the
host's containers to each leaf, and fails a part no host could write —part 0 (java.util.List<p.Step>) holds p.Step, which no loaded plugin declares. The fresh-value round trip alone passed a type whose fresh
value held empty lists, and the first filled one was a value Studio silently could not write. -
plugin validate'smanagedcheck judges an open set's element type (openSet(id).of(E.class)): a class
no loaded plugin declares fails, since no host could write a constant of it. -
A
--studio-apirelease moves Studio'sCONTRACT_FALLBACK_VERSIONto the contract tag it cuts, as
--sdkmovesSDK_FALLBACK_VERSION, and the fallback gate refuses a Studio release whose constant names
no published contract tag. -
Built against
botmaker-studio-api0.4.0 andbotmaker-plugin-host0.2.2:plugin validatereads a palette
with no@Palette.order, which that contract release deleted.
v0.1.3
Changed
-
A release of
--sdkor--plugin-basicsopens a pull request onbotmaker-plugin-registrymoving that
plugin'sverifiedVersionto the new tag, and the registry's gate runs over it there. Studio installs a
ticked plugin at that version, and nothing moved it afterplugin publish, so New Project offered SDK
v1.1.7 and basics v0.0.1. A pull request that cannot be opened warns; the release is not failed. -
plugin validate'svalue-typescheck walks every part a component type's factory declares, through the
host's containers to each leaf, and fails a part no host could write —part 0 (java.util.List<p.Step>) holds p.Step, which no loaded plugin declares. The fresh-value round trip alone passed a type whose fresh
value held empty lists, and the first filled one was a value Studio silently could not write. -
plugin validate'smanagedcheck judges an open set's element type (openSet(id).of(E.class)): a class
no loaded plugin declares fails, since no host could write a constant of it. -
A
--studio-apirelease moves Studio'sCONTRACT_FALLBACK_VERSIONto the contract tag it cuts, as
--sdkmovesSDK_FALLBACK_VERSION, and the fallback gate refuses a Studio release whose constant names
no published contract tag. -
Built against
botmaker-studio-api0.4.0 andbotmaker-plugin-host0.2.2:plugin validatereads a palette
with no@Palette.order, which that contract release deleted.