Releases: keboola/cli
v0.53.0 — conflict-aware `sync pull --force`
Minor release over 0.52.1.
Fixes
-
sync pull --forcesilent baseline corruption → data loss (#376) — a config with un-pushed local edits could be silently de-synced. When a force-pull ran while that config's remote was unchanged (typically to resolve an unrelated config's conflict),--forcere-stamped the manifestpull_hashfrom the edited on-disk file, sosync diffandsync pushthen reported "in sync" and shipped nothing — while the live remote still held the old config. The edits were stranded with no visible signal.--forceis now conflict-aware, branching on the 3-way diff state (config and row granularity):- local edited, remote unchanged → the edit and its sync baseline are preserved (the pending delta stays pushable; no discard, no silent re-stamp).
- local edited AND remote also changed (a true merge conflict) → the pull aborts before writing anything with the new
SyncConflictError(exit 1, error codeSYNC_CONFLICT), listing every conflicting config/row so you can resolve it. - local untouched, remote changed → takes remote, as before.
Note:
--forceno longer discards non-conflicting local edits — to drop a local edit on purpose, delete the file (or config dir) and pull.--all-projectssurfaces a per-project conflict as a structuredSYNC_CONFLICTentry (with the conflicts list) without aborting the batch.
Also
- The
synccommand group is now documented inCLAUDE.md(it was previously missing entirely), plusgotchas.md(since v0.53.0),sync-workflow.md,keboola-expert.md,commands-reference.md, andkbagent context(AGENT_CONTEXT). - New tests: service-layer regression (config + row, preserve case b / abort case a / remote-only-changed), CLI (exit 1 + human +
--jsonSYNC_CONFLICTenvelope), and an E2E force-pull test.
Full changelog: v0.52.1...v0.53.0
v0.52.1 — swap-tables wording fix
Patch release over 0.52.0.
Fixes
- swap-tables wording (#373) — completes the 0.52.0 semantics correction. The user-facing
ConfigErrorraised on a missing--branch(exit 5) no longer claims "The Storage API rejects this on production" — a swap on the default/production branch is supported (it is how a typed rebuild is applied to prod). The same stale "dev branch only" wording was corrected incommands-reference.md, theswap-tablescommand docstring (which feeds the auto-generatedSKILL.mddecision table), and theAGENT_CONTEXTblock (kbagent context). A CLI test that mocked and asserted the old phantom "dev branch" error string was fixed to match the real service message. No behaviour change —branch_idstays mandatory;clone-tablewording is intentionally untouched (clone legitimately targets a dev branch).
Maintenance
Full changelog: v0.52.0...v0.52.1
v0.52.0 — clone-table + Dev Portal admin/MFA fixes
v0.52.0 — clone-table + Dev Portal admin/MFA fixes
First release since v0.51.0. One new storage command, a docs correction verified against a live project, and three Developer Portal fixes (the in-flight 0.51.1 work ships here too).
Highlights
🌿 Pull a production table into a dev branch — kbagent storage clone-table (#368)
On a storage-branches project a dev branch reads production tables transparently until its first write — so trying to reshape one in the branch (swap-tables, dropping a column) fails with a misleading "bucket not found". clone-table materializes the table branch-local so those edits work, leaving production untouched. One-way (default → branch), safe to --dry-run, polls the storage job to completion, and is exposed under kbagent serve. Closes #362.
kbagent storage clone-table --project P --table-id ID --branch ID [--dry-run]
📝 Corrected typify & swap-tables guidance (#368)
Verified live: a dev-branch swap does not reach production via merge (Keboola merges only configurations, not table schema), and swap-tables is supported on the production branch. The typify workflow is reworked into a rehearse-in-a-branch-then-redo-in-prod model; the old "merge promotes the typed schema to production" step was wrong and is removed. Docs only — no behavior change.
🔑 Developer Portal — admin PATCH routing, MFA login, --password-stdin (#366)
Three fixes to kbagent dev-portal: admin identities now route to the permissive PATCH /admin/apps/{app} endpoint (with a fail-fast preflight that explains the misleading 422 a vendor identity hits on admin-only fields); MFA logins send the challenge field the server actually requires (no more bare 404, and the response body is surfaced on failure); and --password-stdin no longer hangs on a terminal (hidden prompt on a TTY, read-to-EOF on a pipe). — thanks @matyas-jirat-keboola
Under the hood
- New layers for clone-table:
KeboolaClient.pull_table,StorageService.clone_table, theclone-tablecommand, and a 1:1 REST routePOST /storage/tables/{project}/{table_id}/pull. Permission classwrite; refuses with exit 5 (before any HTTP call) when neither--branchnor an active branch is set. - Dependency bumps: urllib3 → 2.7.0, idna → 3.15, pip → 26.1, python-multipart → 0.0.27; vitest → 4.1.0 in
web/backend(dev).
Credits
Thanks to @matyas-jirat-keboola for the Developer Portal fixes.
Upgrade
kbagent update
Full changelog: kbagent changelog.
v0.51.0 — Data Streams web UI
Data Streams web UI. The kbagent stream command group (OTLP/HTTP sources, shipped in 0.50.0) now has a page in the kbagent serve --ui web UI under Browse → Data Streams: list sources, create an OTLP/HTTP source (with sink auto-provisioning), inspect endpoints/destination with a reveal toggle for the masked OTLP secret, and delete. Full parity with the kbagent stream * CLI.
Fix — stream now documented in OpenAPI. The router was registered and callable, but its tag was missing from OPENAPI_TAGS, so /docs#/stream rendered as a bare, description-less section. A new smoke test asserts every router tag has an OpenAPI description block, so a router can't ship invisible in /docs again.
Full changelog: kbagent changelog.
v0.50.0
kbagent stream — Data Streams (OpenTelemetry / OTLP) · #364 (closes #357)
New command group to provision and introspect OTLP Data Streams sources from the CLI instead of copy-pasting endpoints out of the UI:
stream list/create-source/detail/deletecreate-source --type otlpauto-provisions the logs/metrics/traces sinks (bucketin.c-otlp-<source>) so data lands in Storage out of the box;--no-sinksopts out.- The ingest endpoint embeds its secret in the URL path → masked by default in every surface;
--revealprints it (e.g. to wireOTEL_EXPORTER_OTLP_ENDPOINTfor a daemon). - Storage-token auth (no manage token). Control plane
stream.<region>derived fromconnection.<region>; ingest URL comes fromsource.otlp.url(never derived). 1:1kbagent serveREST router.
Headless / token-only invocation — the __env__ project · #363 (closes #359)
- Set
KBAGENT_PROJECT_FROM_ENV=1+KBC_TOKEN+KBC_STORAGE_API_URLand run any command with--project __env__— nokbagent project add, noconfig.jsonon disk. The token is ephemeral and never persisted. Works for both the CLI andkbagent serve. - Forgiving stack-URL normalization (bare host, trailing slash, or a full project deep-link all reduce to
https://<host>) onproject add/project edit --url/ the headless injection.
Full per-line details: kbagent changelog.
v0.49.0 — Developer Portal, Feature Flags & GitOps reliability
v0.49.0 — Developer Portal, Feature Flags & GitOps reliability
First release since v0.47.1. Bundles four user-facing additions (the in-flight 0.47.2 and 0.48.0 work ships here too).
Highlights
🛠 Developer Portal management — kbagent dev-portal (#354)
Manage your Keboola component listings straight from the terminal: list and inspect a vendor's apps, patch metadata, upload icons, publish, and deprecate. Production-safe by design — every write prints a diff and requires a human to type a one-time confirmation code on a real terminal. There is no --yes and no env-var bypass, so an AI agent or CI job can read the portal but never silently mutate it. Reads are open (handy for peer-config research) and also exposed via kbagent serve. — thanks @matyas-jirat-keboola
🚩 Feature flag management — kbagent feature (#356)
View and toggle Keboola feature flags at stack, project, and user scope via the Manage API. Same safe super-admin-token handling as org setup (interactive prompt, never persisted, never a CLI argument); writes support --dry-run and confirmation, with a 1:1 REST surface under kbagent serve.
🔁 GitOps sync push reliability (#360)
A transformation scaffolded alongside its variables config is now runnable after a single sync push — variable bindings and default values resolve automatically, no post-push workaround. sync push --branch <id> promotes the local default tree onto a target dev branch. — thanks @ottomansky
❄️ Snowflake workspace fix (#351)
New Snowflake sandbox workspaces now use the Query-Service-compatible key-pair login type, so SQL workspaces created via kbagent work out of the box (the one-time creation output returns the private key). — thanks @zajca
Under the hood
--hintcode generation is deprecated in favor of thekbagent serveREST API; the PR-review agent and contributor docs were updated accordingly. (#355)
Credits
Thanks to @matyas-jirat-keboola, @ottomansky, and @zajca for the contributions in this cycle.
Upgrade
kbagent update
v0.47.1 — semantic-layer reads, fresh-CREATE writeback, sync/storage ergonomics
Bundles every change merged since v0.46.1 — the 0.47.0 feature set (#348) and the 0.47.1 follow-up fix (#350) — into one release.
Highlights
- New:
semantic-layer search-context+get-context— project-wide glob search and single-id lookup that mirror the upstreamkeboola-mcp-serversearch_semantic_context/get_semantic_contexttools, so downstream callers (FIIA, scheduled agents, pre-flight scripts) can drop the MCP dependency for the common "is the model populated?" / "what's at this id?" checks. sync pushfresh-CREATE writeback — placeholder manifest entries (the FIIA / scaffold seed pattern) are now updated in place instead of appended, andKBC.configuration.*metadata on a placeholder is propagated to the remote. Re-pushes are naturally idempotent.- Storage & sync ergonomics —
storage create-table --if-not-exists,sync push|pull|diff --branch <id>,sync push --no-name-drift-warnings.
New commands
kbagent semantic-layer search-context --project P [--pattern G ...] [--type model|dataset|metric|relationship|constraint|glossary|all] [--limit N](#348)kbagent semantic-layer get-context --project P --context-id ID(#348)
Both are read operations, exposed 1:1 over kbagent serve.
sync push / pull / diff
- Fresh-CREATE writeback (#348): a single CREATE now produces a single manifest entry (placeholder updated in place by
(branch_id, component_id, path)), not placeholder + new ULID.KBC.configuration.*keys on the placeholder are propagated viaset_config_metadata. --branch <id>(#348): per-invocation dev-branch override that wins overmanifest.branches[0],active_branch_id, andbranch-mapping.json. Symmetric across push / pull / diff. Mutually exclusive with--all-projects.--no-name-drift-warnings(#348): drops the cosmeticname_drift_warningsarray; detection still runs.
storage create-table
--if-not-exists(#348): opt-in idempotency for parallel workers. A duplicate-display-name failure becomesaction: "skipped"when the table really exists at the expected id; a different table sharing the display name still surfaces the original error.- Skipped envelope reports the actual existing schema (#350, closes #349): on a skip,
columns/primary_key/namenow report the existing table's real schema (not a re-echo of the request). The request is preserved underrequested_columns/requested_primary_key, andschema_drift: boolflags divergence. Human-mode output warns on drift.
Breaking change (direct manifest readers only)
Pre-0.47.0 a single sync push CREATE produced two manifest entries (placeholder + assigned ULID). Post-0.47.0 it produces one (placeholder updated in place). Downstream tooling that worked around the duplication by post-processing the manifest must drop that workaround. Manifest.version is unchanged at 3 (no schema diff; only the writeback flow changed).
Notes
sync push|pull|diffremain filesystem-local and intentionally have no HTTP router; the new--branch/--no-name-drift-warningsflags consequently have no REST counterpart. All other new surfaces are exposed 1:1 overkbagent serve.
Full changelog: v0.46.1...v0.47.1
Credits
The 0.47.0 feature set — semantic-layer reads, fresh-CREATE writeback, and the storage/sync ergonomics — was designed and implemented by @ottomansky (#348), who also filed the follow-up #349 that drove the 0.47.1 schema-reporting fix (#350). Thanks Max!
v0.46.1
Patch release. No CLI runtime behavior change — both items are plugin/tooling.
What's new
Skill now surfaces kbagent data-app logs (#336, closes #335). The kbagent Claude Code skill and the keboola-expert subagent now route log-troubleshooting requests to kbagent data-app logs (shipped in 0.43.8). The SKILL.md description-trigger list gained data-app logs, container logs, app logs, tail logs, build logs, app stdout, app stderr, troubleshoot data app, debug data app, and the keboola-expert Tool Selection Matrix gained a row:
kbagent data-app logs --project P --app-id N [--lines N | --since ISO8601] (0.43.8+)
Before this, asking the agent for a data app's container logs fell back to the UI "Terminal Log" tab or the 20-line-capped get_data_apps MCP tool.
Frontend dev-tooling fix (#341). Bumped web/frontend dev dependencies — vite 5→8, vitest 2→4, and @vitejs/plugin-react 4→5.2 to keep the peer range consistent with vite 8. The earlier Dependabot PRs (#337, #338) bumped only vite + vitest, leaving plugin-react pinned below vite 8; that broke npm ci (ERESOLVE) in the Windows wheel-build job and silently shipped a UI-less wheel. The bundled SPA and kbagent serve --ui are unchanged.
Install
uv tool install git+https://github.com/keboola/cliv0.46.0 — Repository moved to keboola/cli
Repository moved to keboola/cli
The project's canonical home moved from github.com/padak/keboola_agent_cli to github.com/keboola/cli. This release ships from the new home so the fleet migrates itself.
Change. The auto-update and self-install constants (KBAGENT_GITHUB_REPO, KBAGENT_INSTALL_SOURCE) now point at the new repo: the startup version check hits api.github.com/repos/keboola/cli/releases/latest and kbagent update installs from git+https://github.com/keboola/cli. The Claude Code plugin manifest (homepage/repository), the marketplace install instructions (/plugin marketplace add keboola/cli), README / TUTORIAL / CONTRIBUTING, the doctor/serve install hints, the AGENT_CONTEXT snippet, and the README dev-setup clone target were all updated in lock-step. The marketplace name (keboola-agent-cli) and the /plugin install kbagent@keboola-agent-cli identifier are unchanged — they are logical names, not repo paths.
Migration note. Existing installs migrate themselves in a single update cycle: GitHub serves a 301 from the old repo path to keboola/cli, and both auto-update phases follow it (the version check uses httpx with follow_redirects=True; uv/git follow the redirect on clone/fetch). Once you are on >= 0.46.0 the baked-in constants already name the new repo, so the redirect is needed for at most one hop. The old padak/keboola_agent_cli path must not be re-created as a new repository, or the redirect dies and pre-0.46.0 installs are cut off from updates.
Install
uv tool install git+https://github.com/keboola/cliv0.45.0 — Reliability & code quality
Reliability & code-quality release.
- Fixed ~12 silently-broken REST API endpoints in
kbagent serve(config rename / folder / search, table column descriptions, file download, data-app password, variables). They would have failed on the first call — now they work and are covered by regression tests so the issue can't quietly come back. - Strict type-checking is now enforced across the whole codebase (blocking). This is what surfaced the broken endpoints, and it stops the same class of bug from shipping again.
- Fleet observability: every Keboola API call now reports OS + version, so CLI usage can be segmented in monitoring. No tokens, secrets, or user identity are exposed.
--hintis deprecated in favour of thekbagent serveREST API, which now covers every command. The flag still works (with a deprecation notice) and will be removed in a future release.
No breaking changes for CLI users. Upgrade with kbagent update.