Releases: sandeepbollavaram/Kairo
v1.6.0
Atlas Capsule — a portable, token-budgeted AI handoff package. Kairo
already provides continuity artifacts (repo memory, checkpoints, briefs,
Atlas, graphs, telemetry), yet a fresh agent session still tends to re-scan
large parts of the repository to re-orient — wasting context before any new
work starts. Atlas Capsule is the missing bootstrap: a compact, trusted
continuation package generated from existing Kairo state that tells the next
agent what is known, what changed, what to read first, and what is safe
to skip initially. It is a projection only (ADR-0020): no new state store,
no schema changes, no mutation of .kairo/. Capsule reduces unnecessary
rescanning; it does not stop all rescanning or guarantee no rereads — it is
a trusted starting point, not a replacement for validation. Design:
ADR-0020.
Added
- Capsule engine (
src/core/capsule/) — deterministic, replay-safe
projection + renderer. Builds a neutralCapsuleProjectionfrom the latest
checkpoint, Atlas graph, repo intelligence, changed files, git
branch/version, and optional memory recall, then renders target-framed,
budget-bounded markdown. - Three modes with character budgets (a tokeniser-agnostic proxy):
tiny(~1,500),standard(~4,000, default),deep(~20,000). Capsules
are bounded; exceeding the budget appends a visible truncation marker. - Four targets:
claude,codex,cursor,generic— framing only,
never the underlying facts. kairo capsuleCLI command —--mode,--target,--output/-o,
--max-chars,--agents-md,--force,--json. Default
standard/generic; deep is only printed when explicitly requested.kairo_capsule_createMCP tool (experimental) — inputs mode / target /
maxChars / includeAgentsMd / force; output is a compact summary plus
structured JSON (chars, truncation status, files to read first, safe-to-skip
list). Token-efficient by default.- AGENTS.md export (Codex) —
kairo capsule --target codex --agents-md
writes anAGENTS.mdwith a generated header, continuation instructions,
read-first plan, safe-to-skip list, and do-not-touch warnings. Refuses to
overwrite an existing file without--force. - Capsules tab in the Inspect dashboard (
/capsules) — read-only
generated preview with mode/target selectors, char count, truncation
status, files to read first, and safe-to-skip list. This view never writes
a file; create/export is via the CLI or MCP tool. - Docs: docs/CAPSULE.md (full guide) and
docs/CAPSULE_DOGFOOD.md (measured sizes on Kairo
itself + honest limits).
Security
- Capsules pass through Kairo's redaction boundary plus a final redaction pass
in the renderer (secrets removed), and emit only repo-relative paths — no
absolute local paths — so a capsule is safe to paste into another AI agent.
v1.5.0
Kairo Atlas — a local, read-only interactive architecture map. Kairo
already extracts precise structural signals (the collapsed module graph,
salience, risk, checkpoint/session activity) but only stores them as
.kairo/*.jsonl, Mermaid text, and markdown — formats a human cannot
scan to answer "what are the important modules, how is this connected,
what's risky, what did the AI change?". Atlas projects those existing
signals into a navigable picture so a person can see the architecture
instead of reading raw artifacts. It is a projection (ADR-0011): no new
analysis engine, no new MCP tools, no schema changes — a view in the
existing inspect surface at kairo inspect → /atlas. Design and
trade-offs: ADR-0019.
Added
- 2D architecture map (default view) — deterministic, self-authored
canvas renderer over the cached module graph. Pan/zoom/click; nodes
sized by salience (degree centrality), coloured by group, risk rings,
changed-by-AI ticks. Seeded force layout (no third-party graph library). - 3D architecture map — a hand-written perspective projection of the
same payload (rotate / zoom / pan via Shift+drag / reset camera /
depth-aware selection). No three.js, no WebGL library, no CDN. - Search —
/focuses the box; case-insensitive path/module matching
with matched-node halos, neighbour highlighting, and a results list. - Filters — hide docs/tests/examples/generated; focus source-only,
high-salience, high-risk, changed, checkpoint-related, session-related.
Filtering is layout-stable (no relayout) across 2D, 3D, and hit-testing. - Node detail panel — salience, centrality, fan-in/out, group/risk and
changed/checkpoint/session badges, plus clickable incoming/outgoing
dependency lists to walk the graph. Built entirely client-side from the
delivered payload (no new endpoint, no added fields, safe DOM APIs only). - Deterministic graph payload at
GET /atlas/graph.json?kind=&top=:
schema-versioned, nodes sorted(−salience, id), edges(from, to),
repo-relative ids only, top-N salience cap (default 50) with an explicit
honesttruncationblock. No wall-clock time, no randomness, no absolute
paths. - Scoped CSP — only
/atlas*responses carry
default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; base-uri 'none'; form-action 'none'
(nounsafe-inline, nounsafe-eval, no remote origins). The rest of the
inspect surface keeps its stricter JS-freedefault-src 'none'policy. - Documentation — docs/ATLAS.md usage guide and a
README "Kairo Atlas" section. Screenshots are intentionally not
committed (local-first; no binary assets, no remote/CDN images). - Tests — Atlas projection, routes/CSP, 2D, 3D, search/filters, and
detail-panel suites asserting payload shape, CSP equality, and the
absence ofeval/remote origins/innerHTMLin the renderer.
Dogfooded on the Kairo repository itself during development.
Local-first, read-only, no remote assets. Atlas is served from the
loopback inspector, never writes .kairo/, and makes only a same-origin
fetch('/atlas/graph.json').
Honest limitations. The graph is built from statically-extracted
internal relative imports (JS/TS + Python — ADR-0005); dynamic imports and
external packages are excluded by design. Nodes are directory-collapsed for
readability, and large graphs are truncated to the top-N most salient nodes
(the truncation banner says so). Atlas visualizes Kairo's deterministic
signals; it does not claim to understand every codebase.
v1.4.2
Cross-language doctor/init correctness. Three honest defects in
v1.4.0 surfaced by continuing Python-repo dogfood. All three were
"the system works, but it lies about its state" — exactly the kind of
small inaccuracy that erodes trust. v1.4.2 closes them. Reliability
fix only — no MCP contract changes, no schema changes, no new tools,
no new behaviour at runtime.
Fixed
-
Bug A:
kairo initreported the chosen form even when it skipped.
When.mcp.jsonalready declaredkairo, init saidmcp form: global (kairo-mcp on PATH)while the file on disk still had the
stalenode ./node_modules/...local form. The kv row now reads
the actual on-disk form viaclassifyInstalledSpec, matching
whatkairo doctorreports. -
Bug B:
kairo doctorinsisted onpackage.jsonat the project
root. Python / Rust / Go / Java / Ruby repos legitimately don't
have one. Doctor now accepts any of these markers:
package.json,.git,pyproject.toml,requirements.txt,
setup.py,go.mod,Cargo.toml,pom.xml,build.gradle,
build.gradle.kts. The detail line names which marker matched so
the user knows what was found. Truly empty directories still fail
with an honest error listing what was expected. -
Bug C:
kairo doctorran the version-match check against
node_modules/kairo-mcp/package.jsoneven when no local install
existed. Global and npx installs don't have a local
package.jsonto compare to — and the absence of one was being
reported as a failure (kairo-mcp not installed in this project)
despite thekairo-mcp installedcheck having just confirmed the
global PATH install was fine. Doctor now routes per install form:local: comparesnode_modules/kairo-mcp/package.json↔
SERVER_VERSION(unchanged from v1.4.0).global: reports OK + a hint to upgrade vianpm install -g kairo-mcp@latest(the user's package manager owns the version,
not doctor).npx: reports OK + a hint that the version is resolved at
launch by npx (not a local concern).- Inside the kairo-mcp dev repo: compares
dist/index.js↔ the
repo's ownpackage.json(unchanged).
Added
- 8 new regression tests in
tests/doctorNonNode.test.ts
(213/213 total, up from 205):- 5 project-marker tests: Python
pyproject.toml, Python
requirements.txt, RustCargo.toml, Gogo.mod, .git-only
git checkout. All recognised as valid project roots. - 1 negative test: truly empty directory fails project root with
an honest error. - 1 version-match test: Python project with no node_modules does
NOT fail version match. - 1 init-stale-mcp.json regression: Python repo with the v1.0.x-
era broken local-form .mcp.json, afterkairo init --force,
must contain one of the v1.4.0 valid forms (never the broken
node ./node_modules/...).
- 5 project-marker tests: Python
Notes
- 213/213 tests pass.
- Caught and fixed in real-time by a Python repo dogfood
(ImageCompareSoftware) — the same project that found Bug A in
v1.4.0. v1.4.2 ships the whole truthful version of what v1.4.0
intended to be. - The user-visible improvement is that running
kairo initthen
kairo doctorin a Python / Rust / Go repo now reports
all checks passedinstead of3 check(s) need attentionwhen
everything is in fact fine.
v1.4.1
Maintainer GitHub username changed from sandy001-kki to
sandeepbollavaram; swept stale repository links and ownership
metadata.
Fixed
.github/CODEOWNERS—@sandy001-kkino longer resolves after
the rename (GitHub mention resolution doesn't follow username
redirects). Updated to@sandeepbollavaramso review requests route
correctly.package.json—homepage,repository.url,bugs.urlall
swept. npm package page and IDE "view source" links resolve directly
instead of through GitHub's redirect.
Changed
- README.md — CI badge URL, latest-release badge URL, and the
bug-report link in the Troubleshooting section all point at the new
username. - CHANGELOG.md — every compare link (all prior version diffs) now
points at the new namespace. Existing tags resolve identically; the
URLs just no longer rely on GitHub's redirect. PUBLISHING.md— install commands and the scoped-name fallback
example updated..github/ISSUE_TEMPLATE/config.yml— the Discussions deflection
link points at the new namespace.docs/adr/0017-ci-and-repo-policy.md— CODEOWNERS reference in
the ADR text updated to match the file.
Not changed
- No MCP contract changes. No schema changes. No new tools. No
behavioural changes. Pure docs / metadata. - No published
kairo-mcptarball semantics change — the
consumer-facingdist/is identical to v1.4.0. A republish to npm
is optional (the README badges and install commands work either
way; the metadata fields in package.json affect only the next
npm viewoutput). - The old
sandy001-kkiGitHub URLs keep working via GitHub's
redirect as long as nobody claims the old username. This sweep is
insurance against that day, not an emergency.
Notes
- 205/205 tests pass.
- Git history retains the old maintainer email — past commits are
byte-identical, only the live URL metadata moved.
v1.4.0
Cross-language MCP bootstrap reliability. First non-Node-project
dogfood (a Python repo on Windows + Claude Code) caught a real bug:
kairo init always wrote .mcp.json referencing ./node_modules/ kairo-mcp/dist/index.js, which doesn't exist in Python / Rust / Go /
Java / Ruby / empty-directory projects — i.e. most projects an AI
coding agent works in. Claude Code spawned the MCP server, Node
returned MODULE_NOT_FOUND, the connection died with no useful
remediation hint.
v1.4.0 is purely a reliability fix. No new MCP tools, no new
schemas, no new persisted artefacts, no stability registry changes,
no new behaviour at runtime. The only change is the install-time
logic that picks the right .mcp.json shape. See
ADR-0018.
Fixed
-
kairo initnow detects the install environment and writes one
of three valid.mcp.jsonforms, tried in order:- local —
command: "node", args: ["./node_modules/kairo-mcp/ dist/index.js"]when the local install exists (Node project
that rannpm install kairo-mcplocally; old behaviour preserved). - global —
command: "kairo-mcp"whenkairo-mcpresolves
via PATH (i.e.npm install -g kairo-mcpis on the developer's
machine — recommended). - npx —
command: "npx", args: ["-y", "kairo-mcp"]as a
fallback. Works in any directory, any OS, regardless of prior
install. npx fetches on first run; subsequent invocations use
its cache.
Detection is cross-platform:whereon Windows,whichon POSIX.
- local —
-
kairo doctorrecognises all three forms on the.mcp.json wires kairocheck, and reports which form is in use (e.g.
(global form)). Thekairo-mcp installedcheck now passes when
any of the three install paths is reachable, with a remediation
hint specific to which one is missing.
Added
-
src/cli/initSpec.ts— pure-data spec generator + detection
helper. Two exported functions:detect(projectRoot)returns a
DetectionResult(two booleans),chooseMcpSpec(detection)is a
pure function from detection to MCP server spec.
classifyInstalledSpec(entry)recognises any of the three v1.4.0
forms in an existing.mcp.json(used by doctor). -
12 new tests in
tests/initSpec.test.ts: 5 pure-function tests
onchooseMcpSpec, 3 integration tests ondetect()against real
temp directories (Node, Python, empty), 4 classification tests on
classifyInstalledSpecfor the doctor recognition path. -
kairo initoutput gains anmcp formrow in the kv block —
visible signal of which path was chosen. JSON output adds an
mcpInstallFormfield; existing fields keep their semantics
(back-compat). -
README "Quick start" table documents the three forms and when
each fires. -
README "Troubleshooting" section — four common installation
symptoms with one-line fixes for each:/mcpfailed,
kairo: command not found,mcp host: not detected,
MODULE_NOT_FOUNDon pre-v1.4.0 builds.
Changed
kairo init's end-to-end CLI test was relaxed to accept any of
the three valid commands (node,kairo-mcp,npx). It was
previously locked tonode, which is now only one valid outcome.
The 12 new initSpec tests cover the full matrix deterministically.
Notes
- 205/205 tests pass (up from 193 in v1.3.1: +12 new initSpec
tests). - No tarball semantics change. The published
kairo-mcp@xpackage
is unchanged at the file level; v1.4.0 only changes install-time
logic. - Found by the first non-Node-project dogfood (an
image_editor_pythonrepo on Windows + Claude Code). The fix loop
— symptom → diagnosis → ADR → tests → release — closed within the
same evening. This is the maintenance pattern v1.x is designed for.
v1.3.1
Docs-only patch. v1.3.0 published kairo-mcp to npm; v1.3.1 reflects
that in the README badge row so visitors see the published version
and download count at a glance.
Added
- README badge row gains two real, dynamic shields:
[](npmjs.com/package/kairo-mcp)—
latest published version, pulled live from the npm registry.[]— monthly download
count.
Both are dynamic; both will tick upward (or sideways) on their own
as downstream usersnpm installthe package.
Notes
- No code changes. No schema changes. No MCP contract changes. No
CLI behaviour changes. No stability registry changes. Pure docs. - Tag
v1.3.1is shipped to GitHub for completeness, but a re-
publish to npm is NOT required — npm's badge endpoint serves the
latest version regardless of repo tags, and the published tarball
forkairo-mcp@1.3.0is unchanged. - A separate
npm publishfor1.3.1is optional. If desired, run
npm publishper PUBLISHING.md — but the README badges work
whether or not you do.
v1.3.0
npm distribution. Kairo becomes installable like a real developer
tool. No new architecture subsystems, no schema changes, no new MCP
tools — packaging, distribution, install smoke, docs.
Added
-
PUBLISHING.md— single-file maintainer runbook covering npm
account / 2FA prerequisites, the pre-publish gate (mirrors the
install-smoke CI job), the actualnpm publishflow, and the
72-hournpm deprecate/npm unpublishdiscipline. Every
npm publishis a human decision; this file is the reference. -
publishConfig.access: "public"inpackage.json— defensive
(the package name is unscoped, so this is already npm's default,
but explicit-over-implicit is cheaper to get right once). -
Expanded npm
keywords(15 entries, up from 7) for npm search
discoverability: addsclaude,cursor,ai-coding,agent-memory,
local-first,deterministic,cli,typescript. No behaviour
change — npm metadata only. -
Install-smoke now exercises
kairo initend-to-end. The CI
job (1) installs the packed tarball into a fresh project, (2)
runskairo init --jsonand assertsmcpJson === 'written',
(3) verifies.mcp.jsonexists and wireskairo, (4) re-runs
kairo init --jsonand asserts the second run reportsmcpJson === 'skipped'(idempotency contract). Catches every packaging
regression that affects the documented Quick start path.
Changed
- README Quick start now leads with
npm install -g kairo-mcp.
The git-install path is preserved as a "dev tip" fallback for users
who want main-branch builds. Thenpx -p kairo-mcp kairo init
no-install path is documented honestly — including why-p kairo-mcpis needed (npm packages with multiple bins resolve
npx <pkg>to the bin matching the package name, which here is the
MCP server, not the CLI).
Not done in this release (deliberate)
- No actual
npm publishfrom this commit. v1.3.0 is ready
to publish, but the publish itself is a human action run from a
clean local checkout with 2FA. SeePUBLISHING.md. - No MCP tool, schema, persisted artefact, or stability registry
changes. The CLI surface remains experimental per ADR-0016.
Notes
- 193/193 tests pass.
npm pack --dry-runconfirms a clean 266 kB / 384-file tarball:
no.kairo/, no tests, no fixtures, no.git, no.github. Only
dist/,README.md,LICENSE,CHANGELOG.mdship.- The three bins (
kairo,kairo-mcp,kairo-inspect) all land on
PATH afternpm install -g kairo-mcp. After publish, the
documented Quick start becomesnpm install -g kairo-mcp; cd your-project; kairo init— three commands, ≤60 seconds.
v1.2.0
DevEx polish — CLI UX + README clarity. No new architecture
subsystems. No schema changes. No new MCP tools. Pure surface polish
across the developer-facing edges that were rough on first contact.
Changed
-
Top-level
kairo --helpgains a 3-line Quick start callout
above the command list so first-time users see action items
(cd → init → doctor → status) instead of a flat command catalogue.
The footer hint now points tokairo doctorwhen something looks
off, not justkairo help <command>. -
kairo initnow detects the MCP host onPATH(currently
recognises Claude Code; structured to grow) and prints a concrete
3-step Next steps block tailored to what was found:Initialised .mcp.json: written .gitignore: appended mcp host: claude Next steps 1. Open Claude Code in this project: claude 2. Inside the session, run: /mcp → you should see kairo · connected · 41 tools 3. If anything looks off, run: kairo doctorThe
--jsonoutput gains adetectedHostfield. Existing
mcpJson/gitignore/projectRootfields are unchanged. -
kairo doctornow correctly handles the case where it's run
from inside thekairo-mcpdev repo itself (wheredist/index.js
lives at the repo root, not undernode_modules/kairo-mcp/). The
kairo-mcp installedandversion matchchecks fall back to the
self-install path whennode_modules/kairo-mcp/is absent but the
currentpackage.jsonsaysname: "kairo-mcp". -
README.mdQuick start and Real workflow sections updated to
the v1.2.0 output: realistickairo initblock with detected host- next-steps; install line no longer pins to a stale v1.1.0 tag.
Notes
- 193/193 tests still pass. CI matrix (6 cells + install-smoke) all
green on v1.1.3 baseline; v1.2.0 changes don't touch any tested
invariant. - Stability registry unchanged. No new MCP tools. No new persisted
artefacts. The CLI surface remains experimental per ADR-0016. - Success condition for this slice (per the brief): "a new
developer should understand Kairo and run it on a repo in under
5 minutes." Theinit → doctor → statushappy path now takes
3 commands and reads honestly at every step.
v1.1.3
CI caught another real bug, this time on ubuntu-latest · node 20. The
v1.1.2 timeout fix unblocked Windows; v1.1.3 fixes the test-file ordering
race that was hidden until the matrix finally had room to expose it.
Fixed
-
tests/cli.test.tsreturned exit 1 instead of 2 onubuntu-latest · node 20. Root cause:tests/cli.test.tsassumeddist/cli/cli.js
was already built (it didspawnSync(node, [CLI, ...])without first
running the build), so it was racing against
tests/integration.server.test.ts'sbeforeAll(execSync('npm run build')). On 5 of 6 matrix cells the Vitest parallel worker picked
the integration file first; on ubuntu + node 20 it picked the CLI
file first, the bin didn't exist,spawnSyncreturned 1 (Cannot
find module), and the "unknown command exits 2" assertion failed.Fix:
tests/cli.test.tsnow has its ownbeforeAllthat runsnpm run buildifdist/cli/cli.jsis missing — same pattern
integration.server.test.tsuses. Test-file order is now irrelevant.
Notes
- 193/193 tests still pass. No change to MCP tools, CLI behaviour,
schemas, or any stable surface. Test infrastructure only — this
bug was always there, just deterministically masked by parallel
file order on every host except one. - This is the second real bug the CI matrix has caught in 24h.
ADR-0017's premise (cross-platform CI catches deterministic
regressions that local dev can't) keeps holding.
v1.1.2
First downstream CI run caught a real Windows + Node 22 flake. Single-line
timeout fix; no code-layer change. Caught and fixed within an hour of
v1.1.1 going green — exactly the loop ADR-0017 promised.
Fixed
-
tests/snapshot.test.ts"refuses to overwrite a non-empty .kairo/
unless force" timed out at 5000ms onwindows-latest · node 22. The
test does ~2× the work of any other snapshot test (two full
seedProjectcalls + one export + two imports — one rejected, one with
force). Default Vitest 5s ceiling flaked on slow Windows + Node 22 CI
runners wheremkdtemp/rm -rf/spawnare slower. The other five
matrix cells (ubuntu × 2, macos × 2, windows + node 20) all passed.Two-part fix:
- Per-test timeout 20s on that specific test — deterministic ceiling
for the proven-heavy case. - Global
testTimeout: 15_000invitest.config.ts— safety net for
other honest integration tests in this suite (snapshot round-trip,
inspect-server boot, perf scenarios) that do real filesystem + spawn
work. Fast tests are unaffected; the default 5s is just too tight as a
cross-platform ceiling.
- Per-test timeout 20s on that specific test — deterministic ceiling
Notes
- 193/193 tests pass on the v1.1.2 commit on Windows × Node 20 + 22
locally; the matrix gate ran across all six cells. - No change to MCP tools, schemas, or any stable surface. Test infra only.