v0.71.0 — Catch-up release: everything since v0.66.0
Catch-up release: everything merged since v0.66.0 in one update. Versions 0.66.1–0.70.1 landed on main with changelog entries but were never published (v0.66.1 was tagged without notes and 0.67.0–0.70.1 not at all), so auto-update users have been sitting on 0.66.x. v0.71.0 aligns the released version with main. No functional change beyond what the sections below describe.
⚠️ Breaking (0.70.0)
- Removed
data-app git-branchesanddata-app git-entrypoints(and theirkbagent serveendpoints). The sandboxes-service backend dropped the underlying/git-repo/branchesand/git-repo/entrypointsendpoints — they cannot work for managed git repos and will be reworked later via git-service.data-app git-repoand thegit-credentials/git-credentials-createcommands are unchanged. (#474)
Flows: schedules actually fire now (0.66.1)
flow schedulenow activates the schedule on the Scheduler Service, so the cron trigger actually fires. Previously the command only wrote thekeboola.schedulerStorage config; the schedule lookedenabledbut never ran until re-saved in the UI. Schedules created by older kbagent versions stay dormant untilflow scheduleis re-run on 0.66.1+. (#479, #480)flow schedule-removederegisters from the Scheduler Service before deleting the config, so removed schedules stop firing.
Storage
storage create-tablecan copy from an existing table and apply a BigQuery partition/clustering layout (0.67.0).--source-table-idderives the schema from a source table and copies its rows into the requested layout — the supported way to repartition a populated BigQuery table, then flip it into place withstorage swap-tables. New flags:--time-partitioning-*,--range-partitioning-*,--clustering-field. BigQuery-only, with a fail-fast backend pre-flight. (#468)- Upload failures surface the cloud provider's error code —
Cloud storage upload failed (HTTP 403, AccessDenied)instead of a bareHTTP 403;--verboselogs the raw provider error body. (#492)
Search (0.69.0)
kbagent search --regexopts into regex mode on the global-search endpoint — case-insensitive whole-term match against entity names (reportdoes not matchmonthly_report; use.*report.*). Textual-search only. (#471, DMD-1716)- Textual results now report which column names matched:
matched_columnsin--json, a "Matched columns" column in the human table. (DMD-1717)
Semantic layer: field classification & metric generation
- Numeric/temporal roles are classified by normalized type — Keboola's
NUMERICbasetype and BigQuery-nativeINT64/FLOAT64/BIGNUMERICnow classify asmeasureinstead of falling through todimension. (#486) - Alias / linked-bucket tables get real column types resolved from the warehouse
INFORMATION_SCHEMA(alias tables carry no per-column metadata in Storage, so everything used to classify asdimension). CLI:--types-workspace IDor--auto-types-workspace; theserveUI build auto-resolves by default. (#487) semantic-layer buildemits one metric per measure field instead of a singleCOUNT(*)placeholder, with the aggregate guessed from the column name (pct/ratio/avg→ AVG,max→ MAX,min→ MIN, default SUM). (#488)
Reliability: config.json hardening (0.70.1, issue #477)
- Every rewrite first copies the previous config to
config.json.bak(0600), so stored project tokens are recoverable. - File locking moved to a sidecar
config.json.lock— a failed save can no longer leave behind an empty 0-byte config.json that broke the next load. - Config mutations are transactional — an exclusive lock across the load → mutate → save cycle closes the lost-update race where two concurrent kbagent processes silently dropped each other's changes.
Project '<alias>' not founderrors now name the resolved config file and its source, making config split-brain between shells visible. (#496)
Sync / GitOps
sync pushon a dev branch no longer duplicates configs inherited from main (issue #482). Afterbranch use <dev>+sync pull, orphaned files from the previously pulledmain/tree surfaced asaddedand a push CREATEd a duplicate per config. The untracked-config scan is now scoped to the source-branch subtree, plus an adopt-by-id guard. (#494)
Web UI (kbagent serve --ui)
- Repartition BigQuery tables from the table detail (0.71.0): a new Repartition tab picks a time/range partitioning layout plus clustering fields, copies the table into the new layout (
create-table --source-table-id) and atomically swaps it into place — the same supported flow as the CLI. Theservecreate-table endpoint now forwards the source-copy and partition/clustering fields. (#470) - Bulk-remove projects (0.68.0): per-row checkboxes + select-all, a confirmation modal, and a
POST /projects/bulk-deleteendpoint with per-alias error accumulation. Only unregisters from local kbagent config — never deletes Keboola projects. (#469)
Security & AI agents
plaintext_writtenin--jsonenvelopes across all secret-write paths (GHSA-7jrf follow-up): the list of secret key-paths (never values) left in plaintext when--allow-plaintext-on-encrypt-failurefell back;[]on success. Agents see the leak in the envelope, not only on stderr. (#465)- The kbagent Claude Code skill loads again in Claude Desktop — SKILL.md
descriptiontrimmed to fit the Agent Skills spec's 1024-char cap; past the limit the skill failed to load entirely. (#493, #447)
Fixes & docs
- This release ships a
command-reference.mdasset generated from the live Typer command tree of the exact built wheel (238 commands, 27 groups) — a zero-drift command reference that cannot disagree with the shipped CLI. (#500, #498) - Names containing square brackets (e.g. a project named
[e2e] - kbagent bigquery) are no longer swallowed in human-mode output — Rich markup is escaped across the project and storage groups. (#495) docs/error-codes.mdnow documents all 66ErrorCodemembers (was 46), enforced by a newmake check-error-codesgate. (#490)- Release pipeline: unbroken Homebrew + Chocolatey publish jobs (#476), trusted tap in test-install (#483), hardened apk index handling (#464).
- Dependencies:
mcp1.28.0 → 1.28.1 (#489),dompurify3.4.2 → 3.4.12 in the web frontend (#491).
Update with kbagent update (or let the startup auto-update pick it up). Full per-version details: kbagent changelog --full or all releases.