Notable changes to hive-mcp. Format follows Keep a Changelog; versioning follows Semantic Versioning.
This file starts at 1.0.0, which absorbs the work that accumulated on
staging/v0.22.0. Earlier history is in the git log and the release tags.
From 1.0.0 the public seam does not move without a major bump. The seam is three things:
command vocabulary
and the shape of a tool's arguments. Adding a root, a command or an optional
argument is minor. Removing or renaming one, or making an optional argument
required, is major.IAddon contract in
io.github.hive-agi/hive-addon, which reached 1.0.0 alongside this release.
An addon that mounts against hive-mcp 1.x keeps mounting across 1.x.io.github.hive-agi/hive-spi, also 1.0.0. A host cannot
promise stability over ports that publish no promise of their own, which is
why those two went first.What is deliberately NOT promised: anything under an implementation namespace that the tool surface does not expose, the wire format of internal events, and the on-disk layout of the stores.
One thing the artifact does promise that is easy to miss: hive-mcp 1.x ships the datalog backends (datahike, datalevin, datascript) as dependencies. Work is under way to move them behind ports into sibling libraries ([DEVINCULATE-DATALOG]); when they leave the default tree, that is a major bump, not a quiet minor, because a consumer's storage would change under it.
1.0.0 is not a feature release. It is the release where the seam stops moving, and the work below is what had to be true first: the committed tree boots and tests on a clean checkout, the shipped container binds every port it announces, the host no longer calls its own deprecated vars, and the two libraries the contract rests on (hive-spi, hive-addon) publish 1.0.0 promises of their own.
Two large refactors stay open on purpose, because neither changes the seam: [MQ-ADOPT] (internal addon-loader cutover) and [DEVINCULATE-DATALOG] (moving the datalog drivers behind ports). Shipping 1.0 says the contract is stable, not that the roadmap is empty.
io.github.hive-agi/hive-spi 0.2.1 to 1.0.0 and
io.github.hive-agi/hive-addon 0.3.12 to 1.0.0. Both gained a CHANGELOG
and a versioning statement saying what a major, minor and patch mean for an
implementor; neither changed a contract to get there. This pin is the
substance of hive-mcp's own promise, not a routine bump: a host cannot
promise stability over ports that publish none.clj-kondo over src: 129 warnings to 67, 0 errors. Twenty-six files
carried a require or a refer nothing used. tools/registry.clj is the
opposite case and now states it: its twelve legacy consolidated requires are
loaded for their registration side effect, excluded by name in an ns-level
linter config rather than by switching the linter off, so a genuinely dead
require there still reports.Deprecations the host itself still called, resolved per site rather than left standing. A deprecation a host keeps calling never lands: callers feel no pressure to move and the var cannot be removed without breaking the host.
hive-mcp.crystal.hooks/harvest-all, /harvest-session-progress,
/harvest-completed-tasks, /harvest-git-commits and /crystallize-session.
These were backward-compat delegates from the harvest decomposition. Callers
use hive-mcp.crystal.harvest.collect/* and
hive-mcp.crystal.synthesis/synthesize directly, which is what the
deprecation notices said to do. crystal.hooks now holds only event handlers
and hook registration, as its own docstring claimed.hive-mcp.knowledge-graph.connection.writer/drain-writer! and its re-export
on connection. It was a one-line alias for flush-pending!; the six call
sites now call flush-pending!.hive-mcp.agent.hive-agent-bridge and
hive-mcp.agent.drone.backend.hive-agent, deprecated since 0.16.0. The
bridge dispatches through the :ag/run extension key, which no addon in the
ecosystem registers any more (hive-agent contributes :ag/context,
:ag/tools, :ag/loop-factory, :ag/loop-backend, :ag/llm-router), so
the backend could only ever answer "hive-agent is not available on
classpath". Nothing in src required either namespace: ext-router lists
only :sdk-drone and :agentic-loop. Selecting :hive-agent now falls to
the resolve-backend default, which names the registered backends.dev/foss_compliance.clj: measures every public hive-agi repository against
the packaging, mount-contract, host-coupling, version, CI, licence, README
and dependency checks. It enumerates the org from the GitHub API rather than
from a curated list.dev/addon_boot_probe.clj: constructs every addon manifest on the classpath
and asserts the result satisfies IAddon, reporting the cause when it does
not.CONTRIBUTING.md, including the four rules an addon must follow to be
mountable by any host.boot: loads the server closure from the committed deps.edn, both
bare core and starter overlay. The existing deps job runs clojure -P,
which resolves a tree without ever compiling against it, and every
workstation hides the difference behind a gitignored local.deps.edn. This
job is the only check in the repo that runs without those overrides.:coverage alias (cloverage), composing with :test-unit so the measured
suite is the CI suite. Scope it with --ns-regex: instrumenting all 428 unit
namespaces in one JVM is a multi-gigabyte run. First measurement, the
hive-mcp.addons.* slice: 70.15% forms, 79.97% lines.-M:dev:nrepl) died with BindException: Address already in use on port 7910 as soon as the embedded nREPL actually started
(0b61a5e). dev/user.clj booted the system before nrepl.cmdline ran, so
the :hive/nrepl component bound 7910 first and the alias's second nREPL
had nothing left to bind. The :nrepl alias now runs
hive-mcp.server.core, the container's main, and the embedded server is
the only nREPL: it resolves refactor-nrepl beside CIDER when present and
writes .nrepl-port. bin/hive-mcp-foss passes HIVE_NREPL_PORT through
HIVE_MCP_NREPL_PORT instead of appending --port.hive-mcp.events.registry
delegates to hive.events.router/get-event, get-interceptors and
append-interceptor!, none of which existed in a published hive-events jar
(0.5.8 and 0.5.9 ship a byte-identical router.cljc defining none of them).
Fixed by publishing hive-events 0.5.10 and pinning it.hive-test.memory.store-contract, which no published hive-test
carried. Fixed by publishing hive-test 0.3.19 and raising the three pins from
0.3.15.:enabled true, printed it, and the start function then asked
config/get-service-value, which defaults to false and has no config.edn
to read in a container. Both statuses were derived from the request rather
than the result, so neither could report it. nREPL (7910) died on a
NullPointerException in nrepl.server/default-handler: CIDER lists its
middleware by symbol, those namespaces are not loaded in the container, and
one nil in the middleware vector loses the whole server. Ports now measured
bound and the container reports healthy.StdioBridge and NoopMcpBridge declared IAddon while omitting
excluded-tools and hooks. Both threw AbstractMethodError, which the
host's rescue at the call sites turned into "this addon contributes
nothing" with no error surfaced anywhere: a bridge addon's hooks were never
registered and its tool exclusions never applied.clojure.string/* or taoensso.timbre/* fully
qualified without requiring them, resolving only by load-order luck.hive-mcp.tools.kanban.events/edit-fx was defined twice, byte-identically.reset! or run! now declare the :refer-clojure :exclude, so the shadowing is intentional in the source instead of a warning
on every boot.hive-mcp.addons.terminal is now a re-export of hive-addon.terminal
rather than the definition site of ITerminalAddon. Defining a companion
protocol in the host left vessel addons with no contract to depend on, so
they had to reify a host namespace to implement it. Historical qualified
names still resolve.starter.deps.edn, merged over deps.edn by
bin/hive-mcp-foss (HIVE_STARTER=0 opts out). deps.edn itself stays free
of backend coordinates.:runtime/ports is
injected at init-addon! rather than only at manifest discovery.timeout_ms on the Emacs-backed git tools.get-entries-projected receives the projection map it actually reads.pass itself finds it.Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |