IAddon hive.connectors. Construction is pure. initialize! validates the
config and starts the digest scheduler; shutdown! stops it.
The scheduler is one daemon thread that wakes every :digest/tick-seconds, reads the persisted state, and posts the daily digest when it is due (the local hour reached, today not posted). Due-ness comes from the state file, so a restart never posts twice and a host that was down at the hour posts when it returns.
Config: manifest :addon/config, then config.edn
:addons {"hive.connectors" {:digest/channel "#general" ..}}. See
hive.connectors.digest.config for every key.
IAddon `hive.connectors`. Construction is pure. `initialize!` validates the
config and starts the digest scheduler; `shutdown!` stops it.
The scheduler is one daemon thread that wakes every :digest/tick-seconds,
reads the persisted state, and posts the daily digest when it is due (the
local hour reached, today not posted). Due-ness comes from the state file,
so a restart never posts twice and a host that was down at the hour posts
when it returns.
Config: manifest `:addon/config`, then config.edn
`:addons {"hive.connectors" {:digest/channel "#general" ..}}`. See
hive.connectors.digest.config for every key.The daily digest, end to end. Collect a window of hive-agi activity (merged pull requests from GitHub; releases and news from RSS or Atom feeds, the hive-store release feed by default), compose it, render it, and post it to Slack once a day: the digest as the message, and a Markdown copy in its thread for pasting into ClojureVerse, Reddit or Discord.
Every effect arrives in deps, so the pipeline runs against stubs:
:merged-prs! (fn [window]) -> GitHub search hits
:fetch-text! (fn [url]) -> feed XML
:post! (fn [text opts]) -> {:ok :ts :channel} | {:ok false :error}
:read-state (fn []) -> state map
:write-state! (fn [state])
The daily digest, end to end. Collect a window of hive-agi activity
(merged pull requests from GitHub; releases and news from RSS or Atom
feeds, the hive-store release feed by default), compose it, render it,
and post it to Slack once a day: the digest as the message, and a
Markdown copy in its thread for pasting into ClojureVerse, Reddit or
Discord.
Every effect arrives in `deps`, so the pipeline runs against stubs:
:merged-prs! (fn [window]) -> GitHub search hits
:fetch-text! (fn [url]) -> feed XML
:post! (fn [text opts]) -> {:ok :ts :channel} | {:ok false :error}
:read-state (fn []) -> state map
:write-state! (fn [state])The release roundup, end to end: read every public library of the Maven group (Clojars artifact API for downloads and sibling dependencies, Maven metadata for the release date, GitHub for which repositories are public), sort it into tiers, render it, and post it to the announcement channel at most once per ISO week, with the raw text in a thread for Clojurians.
Effects arrive in deps, on top of the digest's:
:list-artifacts! (fn [group]) -> artifact names
:artifact-info! (fn [group artifact]) -> Clojars artifact JSON
:public-repos! (fn [org]) -> {repo-name description}
:fetch-text! (fn [url]) -> Maven metadata XML
:post! :read-state :write-state!
The release roundup, end to end: read every public library of the Maven
group (Clojars artifact API for downloads and sibling dependencies, Maven
metadata for the release date, GitHub for which repositories are public),
sort it into tiers, render it, and post it to the announcement channel at
most once per ISO week, with the raw text in a thread for Clojurians.
Effects arrive in `deps`, on top of the digest's:
:list-artifacts! (fn [group]) -> artifact names
:artifact-info! (fn [group artifact]) -> Clojars artifact JSON
:public-repos! (fn [org]) -> {repo-name description}
:fetch-text! (fn [url]) -> Maven metadata XML
:post! :read-state :write-state!Effects for the digest: GitHub search, feed fetches, Slack, the state file, and secrets. Each fn does one effect and returns plain data.
Effects for the digest: GitHub search, feed fetches, Slack, the state file, and secrets. Each fn does one effect and returns plain data.
Pure. The public libraries of a Maven group, sorted for an announcement: tiers by maturity, the releases since the last roundup, and how the core libraries depend on one another.
A library record: {:name :version :published Instant :downloads long :deps #{sibling names} :description}
Pure. The public libraries of a Maven group, sorted for an announcement:
tiers by maturity, the releases since the last roundup, and how the core
libraries depend on one another.
A library record: {:name :version :published Instant :downloads long
:deps #{sibling names} :description}Pure. One window of raw hive activity -> one digest value. Rendering lives in hive.connectors.digest.render.
Pure. One window of raw hive activity -> one digest value. Rendering lives in hive.connectors.digest.render.
Pure. Raw addon config -> digest settings with defaults, or the list of problems. Only :digest/* keys are read.
:digest/enabled? post on schedule (default true) :digest/channel Slack channel name or id (default #updates) :digest/hour local hour the post is due (0-23, default 9) :digest/zone time zone id (default America/Bahia) :digest/org GitHub organization (default hive-agi) :digest/maven-group Maven group whose new releases lead the post, each with its changelog (default io.github.hive-agi; nil turns the section off) :digest/maven-repo repository holding its metadata (default Clojars) :digest/feeds ["https://.." {:feed/url .. :feed/id .. :feed/role :release|:news}] default: the hive-store release feed, as :release :digest/slack-token {:env "SLACK_BOT_TOKEN" :command ["pass" "show" ".."]} :digest/github-token {:env "GITHUB_TOKEN" :command ["gh" "auth" "token"]} :digest/title :digest/tagline :digest/links [[label url] ..] :digest/per-repo :digest/total item caps for the post :digest/default-hours :digest/max-hours window bounds :digest/copy-paste-thread? reply with the Markdown copy :digest/state-file :digest/tick-seconds :digest/initial-delay-ms
Pure. Raw addon config -> digest settings with defaults, or the list of
problems. Only :digest/* keys are read.
:digest/enabled? post on schedule (default true)
:digest/channel Slack channel name or id (default #updates)
:digest/hour local hour the post is due (0-23, default 9)
:digest/zone time zone id (default America/Bahia)
:digest/org GitHub organization (default hive-agi)
:digest/maven-group Maven group whose new releases lead the post, each
with its changelog (default io.github.hive-agi;
nil turns the section off)
:digest/maven-repo repository holding its metadata (default Clojars)
:digest/feeds ["https://.." {:feed/url .. :feed/id .. :feed/role :release|:news}]
default: the hive-store release feed, as :release
:digest/slack-token {:env "SLACK_BOT_TOKEN" :command ["pass" "show" ".."]}
:digest/github-token {:env "GITHUB_TOKEN" :command ["gh" "auth" "token"]}
:digest/title :digest/tagline :digest/links [[label url] ..]
:digest/per-repo :digest/total item caps for the post
:digest/default-hours :digest/max-hours window bounds
:digest/copy-paste-thread? reply with the Markdown copy
:digest/state-file :digest/tick-seconds :digest/initial-delay-msPure. Parse an RSS 2.0, RSS 1.0 or Atom document into items, through the hardened parser in hive.connectors.digest.xml.
Pure. Parse an RSS 2.0, RSS 1.0 or Atom document into items, through the hardened parser in hive.connectors.digest.xml.
Pure. Classify a merged pull request by its title, the way the hive repos write titles: Conventional Commits, plain sentences, and staging promotions. Decide which items a public daily post lists.
Pure. Classify a merged pull request by its title, the way the hive repos write titles: Conventional Commits, plain sentences, and staging promotions. Decide which items a public daily post lists.
The digest and the release roundup from a shell, without a running hive:
clojure -M:digest preview print today's Slack text and Markdown copy clojure -M:digest post [--force] post the digest, once a day clojure -M:digest announce-preview print the release roundup clojure -M:digest announce [--force] post the roundup, once per ISO week, only when something was released clojure -M:digest status settings and persisted state
--channel <name|id> overrides the channel of a post or announce.
Settings are the same as the addon's: config.edn (HIVE_MCP_CONFIG, else ~/.config/hive-mcp/config.edn) under :addons "hive.connectors". Secrets come from SLACK_BOT_TOKEN and GITHUB_TOKEN when set, which is how a Kubernetes CronJob runs it. The state file is shared with the addon, so nothing is posted twice for the same day or week.
The digest and the release roundup from a shell, without a running hive:
clojure -M:digest preview print today's Slack text and Markdown copy
clojure -M:digest post [--force] post the digest, once a day
clojure -M:digest announce-preview print the release roundup
clojure -M:digest announce [--force] post the roundup, once per ISO week,
only when something was released
clojure -M:digest status settings and persisted state
`--channel <name|id>` overrides the channel of a post or announce.
Settings are the same as the addon's: config.edn (HIVE_MCP_CONFIG, else
~/.config/hive-mcp/config.edn) under :addons "hive.connectors". Secrets
come from SLACK_BOT_TOKEN and GITHUB_TOKEN when set, which is how a
Kubernetes CronJob runs it. The state file is shared with the addon, so
nothing is posted twice for the same day or week.Pure. Maven repository metadata -> the release it records. Clojars stamps
lastUpdated when a version is deployed, so it dates the newest release.
Pure. Maven repository metadata -> the release it records. Clojars stamps `lastUpdated` when a version is deployed, so it dates the newest release.
Pure. A digest value -> text in one chat dialect. Two dialects ship: Slack mrkdwn (the post itself, which copies cleanly into another Slack workspace such as Clojurians) and Markdown (ClojureVerse, Reddit, Discord, GitHub discussions).
Pure. A digest value -> text in one chat dialect. Two dialects ship: Slack mrkdwn (the post itself, which copies cleanly into another Slack workspace such as Clojurians) and Markdown (ClojureVerse, Reddit, Discord, GitHub discussions).
Pure. A catalog -> the release roundup, in Slack mrkdwn, kept to about twenty lines: the post for #announcements, and the raw text that pastes into Clojurians with "Format messages with markup" on.
Pure. A catalog -> the release roundup, in Slack mrkdwn, kept to about twenty lines: the post for #announcements, and the raw text that pastes into Clojurians with "Format messages with markup" on.
Pure. When today's digest is due, and which window of time it covers.
Pure. When today's digest is due, and which window of time it covers.
Pure text helpers for the digest, over hive-system.pattern. Every pattern is named here once; call sites name what they look for.
Pure text helpers for the digest, over hive-system.pattern. Every pattern is named here once; call sites name what they look for.
Pure. A hardened DOM parser and the few element helpers the digest reads feeds and Maven metadata with. DOCTYPEs are refused, so a hostile document cannot expand entities or read local files.
Pure. A hardened DOM parser and the few element helpers the digest reads feeds and Maven metadata with. DOCTYPEs are refused, so a hostile document cannot expand entities or read local files.
GitHub connector implementing IConnector protocol.
Uses the official Java SDK (kohsuke/github-api) for:
GitHub connector implementing IConnector protocol. Uses the official Java SDK (kohsuke/github-api) for: - Issue management (CRUD, comments, labels) - Pull request operations (list, comment, review status) - Webhook handling for real-time events - OAuth/PAT authentication
Core protocols for hive-connectors.
These protocols define the contract for external service integrations, following the IKGStore pattern from hive-mcp.
Core protocols for hive-connectors. These protocols define the contract for external service integrations, following the IKGStore pattern from hive-mcp.
Slack connector using official Java SDK. Sends hivemind events to Slack channels.
Slack connector using official Java SDK. Sends hivemind events to Slack channels.
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 |