Releases: kleisli-io/cairn
Release list
v0.1.1
Fixed
- The release bundle now carries a generated
resources.sexpmanifest mapping the bundled prompt directory to its place in the bundle, so a source install serves the workflow prompts —workon,handoff,implement,plan,research,validate— over MCPprompts/listandresources/list. Requires kli ≥ 0.1.3, which registers the manifest's roots at load; on older kli the prompts remain unavailable (tools are unaffected either way).
Install
kli install https://github.com/kleisli-io/cairn/releases/download/v0.1.1/cairn.bundle 1b92b2928de8de87711c299d7353f1e0b602068e
The second argument is the artifact's git-tree-sha1 pin: kli recomputes it over the unpacked tree and refuses on mismatch (integrity floor, always on). Then serve it to any MCP client with kli mcp-serve cairn.
To additionally require the release signature (authenticity, opt-in), add the Kleisli.IO release key to trustRoots in your kli settings.json:
"trustRoots": ["373cb80b9c572f0f437b868a6cd6ffa4f174576567e2ebeb9f2b8e26414e056e"]With a trust root set, kli fetches cairn.bundle.sig alongside the artifact and installs only if the ed25519 signature over the bundle verifies against a trusted key. The same key is committed at release/trust/cairn-release.pub. SHA-256 sums of both assets are in checksums.txt.
v0.1.0
First public release of cairn — a durable task graph your agent plans in and resumes into. When a session resets, the agent reloads the plan from the graph instead of reconstructing it from the conversation: open phases, dependencies, status, and the reasoning behind each decision are all still there. cairn ships as a kli extension and serves to any MCP client — Claude Code, Claude Desktop, Cursor — with a single kli mcp-serve cairn.
Added
- Plan as a task graph. Slug-addressed, date-prefixed tasks and a typed edge model — structural
phase-of(single parent) plus lateraldepends-onandrelated— so a plan is a queryable DAG, not a paragraph buried in the transcript. - One-call re-entry.
task_bootstrapdrops the agent back exactly where it left off — state, neighbors, open handoffs, recent observations, and what other sessions are doing — in a single call. - Observation memory. Freeform notes attach to tasks as the work happens, so the reasoning behind a decision is still around when you need it; they're the cheapest write, made to be recorded as you go.
- Full-text recall. Observations are indexed with SQLite FTS5 and ranked with snippets, so finding "what we worked out about X" is one
task_searchinstead of scrolling back through old chat. - A queryable plan — the TQ language.
task_queryis a small, composable language over the graph: sources threaded through steps with->, set algebra (:union,:intersect,:minus), coalescing (:or-else), transitive:closure, predicates, and quantifiers. It describes itself through the(schema),(views),(fields), and(edges)sources, so its documentation never drifts from its behavior. - Batteries-included views. Ten built-in named views —
active-roots,orphans,leaf-tasks,stale-phases,plan,plan-frontier(aliasfrontier),recent,busy,hub-tasks,knowledge— answer the everyday "what's ready, what's stalled, what's mine" out of the box. - Views you define. Save your own queries with
task_query_write—(define! "name" Q)/(undefine! "name")— persisted as events and recalled through(query "name"), shadowing built-ins of the same name. - Queries that write. Mutating steps —
(:set-status! …),(:set! …),(:link! …),(:unlink! …)— update the graph in place, each recording an event, converging on re-run and safe to resume mid-way; sub-query operands stay read-only. - Read and write gate separately. Give an agent recall and navigation without the power to change the graph; the 14 tools split into read, write, and observe, and the boundary is enforced by capability rather than by which tool names you expose.
- History that survives a rebuild. Every write appends one event to an append-only log and folds into a queryable projection; replaying the log reproduces the same state — your custom views and full history included — so a rebuild loses nothing.
- Safe for many sessions at once. Concurrent writers never tear a line, a running store learns in O(1) whether any log has moved, and every tool call refreshes from peers' writes before it runs — so a handle held open across another session's work sees that work on its next call, at no per-log cost when nothing changed.
- Per-session focus. Each session carries its own current-task pointer; most tools act on it unless you pass an explicit
task_id, andtask_forkalways makes its new child current. - Legible output. Rectangular projections print every selected field on every row (an absent value as
∅, a timestamp as its raw integer plus the decoded UTC date);(:select …)never silently drops a column; and an unknown field, predicate, step, source, or edge errors with a "did you mean …?" suggestion. - Time-aware queries. Date predicates —
(on …),(since …),(before …)— window a timestamp field by UTC calendar day, alongside(:sort FIELD :asc|:desc)and timestamp-aware numeric comparisons overcreated-ts,updated-ts, andstatus-ts. - Rich history views.
timelinefilters by event type, windows and pages by sequence, and renders events verbatim on demand, bounded so output stops before an overflow and prints a continuation cursor. - Bundled workflow prompts. Reusable prompts —
research,plan,implement,validate,resume,handoff— mounted by the host runtime and exposed to MCP clients as prompts and readable resources. - Nix flake exposing the library (
packages.cairn), the FiveAM suite and FTS5 drift gate (checks), and an SBCL + SQLite dev shell, forx86_64-linux,aarch64-linux, andaarch64-darwin.
Install
kli install https://github.com/kleisli-io/cairn/releases/download/v0.1.0/cairn.bundle f97b592316027ef9c8c56d2072a75b6b596a0172
The second argument is the artifact's git-tree-sha1 pin: kli recomputes it over the unpacked tree and refuses on mismatch (integrity floor, always on). Then serve it to any MCP client with kli mcp-serve cairn.
To additionally require the release signature (authenticity, opt-in), add the Kleisli.IO release key to trustRoots in your kli settings.json:
"trustRoots": ["373cb80b9c572f0f437b868a6cd6ffa4f174576567e2ebeb9f2b8e26414e056e"]With a trust root set, kli fetches cairn.bundle.sig alongside the artifact and installs only if the ed25519 signature over the bundle verifies against a trusted key. The same key is committed at release/trust/cairn-release.pub. SHA-256 sums of both assets are in checksums.txt.