From a1904d8ab8c727bea035b8645e74772bccef754b Mon Sep 17 00:00:00 2001 From: Petr Date: Mon, 20 Jul 2026 16:07:52 +0200 Subject: [PATCH 1/2] docs(changelog): backfill entries for PRs merged without a version bump Ten PRs merged since v0.66.1 carried no changelog entry because they did not bump the version, so 'kbagent changelog' and the post-update What's new display would silently omit them. Attributed to the version whose bump window they were merged in: - 0.67.0: #465 (plaintext_written --json field), #490 (error-codes.md complete + check-error-codes gate) - 0.70.0: #486 (semantic-layer numeric/temporal role classification) - 0.70.1: #487 (alias/linked-bucket column-type resolution), #488 (one metric per measure field), #482/#494 (sync push dev-branch duplicates), #492 (cloud-provider error code in upload failures), #495 (Rich markup escaping in names), #493 (SKILL.md 1024-char cap) Dependency-only #489 (mcp 1.28.0 -> 1.28.1) intentionally left out. --- src/keboola_agent_cli/changelog.py | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/keboola_agent_cli/changelog.py b/src/keboola_agent_cli/changelog.py index ecb03cd0..5b762d6d 100644 --- a/src/keboola_agent_cli/changelog.py +++ b/src/keboola_agent_cli/changelog.py @@ -42,6 +42,42 @@ "project vanishing from config.json when another command saved a stale snapshot. All " "ConfigStore mutation methods, `permissions set/reset`, the default-project pin, and " "the org-metadata backfill now run inside a transaction.", + "Fix (#482): `sync push` on a dev branch no longer creates duplicates of configs " + "inherited from main. After `branch use ` + `sync pull`, the manifest is replaced " + "with the dev branch's entries, orphaning the previously pulled `main/` tree on disk; " + "the untracked-config walker kept that tree in scope, so every inherited config " + "surfaced as `added` (empty config_id) and a push CREATEd a duplicate on the branch. " + "diff/push now scan for untracked configs only in the resolved source-branch subtree, " + "and an untracked config whose id resolves on the target branch and is unclaimed by " + "the manifest diffs against the existing remote config (adopt-by-id) instead of " + "creating a duplicate.", + "New (#487): `semantic-layer build` resolves column types for alias / linked-bucket " + "tables from the warehouse INFORMATION_SCHEMA, fixing their all-`dimension` field " + "classification (an alias table carries no per-column datatype metadata in Storage, so " + "the role heuristic saw empty types). Pass `--types-workspace ID` explicitly or " + "`--auto-types-workspace` to auto-pick a read-only Query-Service-capable workspace per " + "backend; the `serve` UI build auto-resolves by default. A table with no resolvable " + "workspace is reported non-fatally in `type_resolution_errors` and the build proceeds.", + "New (#488): `semantic-layer build` emits one metric per `measure` field instead of a " + "single COUNT(*) placeholder per table. The aggregate is guessed from the column name " + "(avg/mean/rate/pct/percent/ratio/share -> AVG; max/peak -> MAX; min -> MIN; default " + "SUM), mirroring the semantic-layer toolkit's generator.", + "Improved (#492): cloud-storage upload failures now surface the provider's short error " + "code -- `Cloud storage upload failed (HTTP 403, AccessDenied)` instead of a bare " + "`HTTP 403` -- and `--verbose` logs the raw provider error body (truncated to 1500 " + "chars) at DEBUG before raising. Applies to `storage file-upload`, `storage " + "upload-table`, and every other upload path through the shared cloud-upload helper.", + "Fix (#495): names containing square brackets are no longer swallowed in human-mode " + "output. A project named `[e2e] - kbagent bigquery` rendered as ` - kbagent bigquery` " + "(`[e2e]` was parsed as a Rich markup tag) in `project add`/`list`/`status`/`info` and " + "storage tables; user- and API-sourced names are now escaped via `rich.markup.escape()` " + "across the project and storage groups. `--json` output always carried the correct " + "value.", + "Fix (#493, issue #447): the kbagent Claude Code skill loads again in Claude Desktop. " + "The SKILL.md frontmatter `description` had grown to 5069 characters; the Agent Skills " + "spec caps it at 1024 and Claude Desktop enforces the cap at load time, so the skill " + "failed to load entirely. Rewritten to 965 characters, still naming every command " + "domain and the highest-value trigger keywords.", "Improved: `Project '' not found` errors now name the RESOLVED config file and " "its source, e.g. `Project 'x' not found in /home/u/.kbagent/config.json (source: " "local). Run 'kbagent project list' to see configured projects.` Config resolution is " @@ -56,6 +92,11 @@ "work for managed git repos and will be reworked later via git-service. This CLI was the " "sole remaining consumer. `data-app git-repo` (clone-URL introspection) and the " "`git-credentials` / `git-credentials-create` commands are unchanged.", + "Fix (#486): `semantic-layer build` and `add dataset --deep-fields` no longer classify " + "numeric measure columns as `dimension`. Field-role classification now normalizes " + "column types before matching, so Keboola's `NUMERIC` basetype and BigQuery-native " + "`INT64`/`FLOAT64`/`BIGNUMERIC` count as numeric (-> `measure`) and temporal variants " + "map to `timestamp`, on both Snowflake and BigQuery.", ], "0.69.0": [ "New: `kbagent search --regex` opts into regex mode on the global-search endpoint " @@ -97,6 +138,17 @@ "`create-table` runs a one-call backend pre-flight (token verify) when any of them " "is used and fails fast with a clear message on a non-BigQuery project, before " "issuing the create. A plain columns create is unaffected (no extra call).", + "New (#465): secret-write commands' `--json` envelopes now carry a `plaintext_written` " + "field -- the list of secret key-paths (never values) left in plaintext when " + "`--allow-plaintext-on-encrypt-failure` fell back; `[]` when encryption succeeded. " + "Covers `config update` / `config new --push` / `config row-create` / `config " + "row-update` / `config variables-set` and `data-app create` / `data-app secrets-set`. " + "GHSA-7jrf follow-up: agents and scripts see the leak in the envelope, not only in the " + "stderr warning.", + "Note (#490): `docs/error-codes.md` now documents all 66 `ErrorCode` members (was 46 -- " + "everything added since ~0.22.0 was missing: Flow, Data Apps, Developer Portal, the " + "`kbagent serve` envelope codes, and the newer Sync/Auth codes). A new `make " + "check-error-codes` gate keeps the doc in lockstep with the enum.", ], "0.66.1": [ "Fix (#479): `flow schedule` now activates the schedule on the Scheduler Service, so the cron " From f9ce46555b775b79068bf8e73289e2fdbf26949e Mon Sep 17 00:00:00 2001 From: Petr Date: Mon, 20 Jul 2026 16:38:28 +0200 Subject: [PATCH 2/2] chore(release): bump version to 0.71.0 (alignment release) 0.67.0-0.70.1 were merged to main but never tagged or published, so auto-update users are still on 0.66.1. 0.71.0 is the catch-up release that ships all of it in one update. Changelog entry documents the alignment; per-version entries stay attributed to their bump windows. --- .claude-plugin/marketplace.json | 2 +- plugins/kbagent/.claude-plugin/plugin.json | 2 +- pyproject.toml | 2 +- src/keboola_agent_cli/changelog.py | 7 +++++++ uv.lock | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index a4a889dc..730a9cde 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,7 @@ "plugins": [ { "name": "kbagent", - "version": "0.70.1", + "version": "0.71.0", "source": "./plugins/kbagent", "description": "AI-friendly interface to Keboola Connection projects — explore configs, jobs, lineage, call MCP tools, manage dev branches, and debug SQL in workspaces", "category": "development" diff --git a/plugins/kbagent/.claude-plugin/plugin.json b/plugins/kbagent/.claude-plugin/plugin.json index 74096355..f2da3681 100644 --- a/plugins/kbagent/.claude-plugin/plugin.json +++ b/plugins/kbagent/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "kbagent", - "version": "0.70.1", + "version": "0.71.0", "description": "AI-friendly interface to Keboola Connection projects — explore configs, jobs, lineage, call MCP tools, manage dev branches, and debug SQL in workspaces", "author": { "name": "Keboola", diff --git a/pyproject.toml b/pyproject.toml index 25f09226..93bed0db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "keboola-cli" -version = "0.70.1" +version = "0.71.0" description = "AI-friendly CLI for managing Keboola projects" readme = "README.md" requires-python = ">=3.12" diff --git a/src/keboola_agent_cli/changelog.py b/src/keboola_agent_cli/changelog.py index 5b762d6d..20a190e5 100644 --- a/src/keboola_agent_cli/changelog.py +++ b/src/keboola_agent_cli/changelog.py @@ -24,6 +24,13 @@ # Ordered newest-first. Each value is a list of brief one-line descriptions. CHANGELOG: dict[str, list[str]] = { + "0.71.0": [ + "Note: version-alignment release -- the first published release since v0.66.1. " + "Versions 0.67.0 through 0.70.1 were merged to main with their changelog entries but " + "never tagged or published (no GitHub Release, so auto-update never picked them up); " + "0.71.0 ships everything listed under those versions in one update. No functional " + "change beyond what 0.67.0-0.70.1 describe.", + ], "0.70.1": [ "Fix: config.json reliability hardening (issue #477). Every rewrite now first copies the " "previous config.json to `config.json.bak` (0600, same directory), so stored project " diff --git a/uv.lock b/uv.lock index 1494a114..5394d839 100644 --- a/uv.lock +++ b/uv.lock @@ -590,7 +590,7 @@ wheels = [ [[package]] name = "keboola-cli" -version = "0.70.1" +version = "0.71.0" source = { editable = "." } dependencies = [ { name = "croniter" },