Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"plugins": [
{
"name": "kbagent",
"version": "0.62.0",
"version": "0.63.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"
Expand Down
2 changes: 1 addition & 1 deletion plugins/kbagent/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kbagent",
"version": "0.62.0",
"version": "0.63.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",
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "keboola-cli"
version = "0.62.0"
version = "0.63.0"
description = "AI-friendly CLI for managing Keboola projects"
readme = "README.md"
requires-python = ">=3.12"
Expand Down
31 changes: 31 additions & 0 deletions src/keboola_agent_cli/changelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,37 @@

# Ordered newest-first. Each value is a list of brief one-line descriptions.
CHANGELOG: dict[str, list[str]] = {
"0.63.0": [
"New (#428): the importable SDK is now statically typed -- a PEP 561 `py.typed` "
"marker ships in the wheel and the high-traffic facade operations return typed "
"pydantic models (`JobResult`, `QueryResult`, `UploadTableResult`, `SyncPushResult`, "
"`ConfigDetailResult`, `CloneResult`) exported from the package root. Downstream "
"`mypy`/`ty`/IDEs now treat `keboola_agent_cli` as typed, so an SDK contract change "
'surfaces at type-check time instead of at runtime. Every model is `extra="allow"` '
"(backend field drift never raises) and accepts the raw API key or the snake_case "
"field name, so `Model.model_validate(service_dict)` works directly. Typed at the "
"facade only: the dict-returning service layer and `--json` CLI output are unchanged. "
"New typed wrappers: `Client.run_job` / `query_result` / `config_detail` / `upload_table`.",
"New (#427): `kbagent job run --idempotency-key KEY [--force-rerun]` (and "
"`Client.run_job(idempotency_key=..., idempotency_store=...)`) makes a replayed, "
"interrupted build step safe -- a prior still-running or non-failed job is returned "
"instead of creating a duplicate side effect; a prior failed run is re-run. The Queue "
"API `POST /jobs` has no server-side idempotency token (verified against the live spec "
"v1.3.8 and the job-queue server source -- the internal `deduplicationId` is "
"daemon-only), so dedup is client-side: a `JobIdempotencyStore` (atomic, fcntl-locked, "
"0600) at `<config-dir>/job_idempotency.json`. Reusing a key for a different "
"component/config raises; dedup is scoped to one machine.",
"New (#426): `kbagent sync clone --source DIR --target ALIAS --target-dir DIR` (and "
"`SyncService.clone_project` -> `CloneResult`) builds a new project by cloning a "
"reference synced tree and parameterizing it via declarative override files -- "
"`--bucket-map` (rewrite storage input/output bucket prefixes), `--variable-values` "
"(override keboola.variables rows), `--instance-rename` (rename config-path prefixes) "
"-- then pushes so every config CREATEs fresh. A new push Phase D remaps `keboola.flow` "
"task `configId`s reference->ULID via `created_id_map` (generic; benefits any "
"fresh-create push), alongside the Phase-C variable-link remap. Cloning into a fresh "
"target needs no id surgery; a fresh-target guard refuses a non-empty target and a "
"re-run with an existing target-dir is idempotent (`no_changes`).",
],
"0.62.0": [
"New (#417): `storage download-table` gains server-side row filtering -- "
"`--where-column` + `--where-value` (repeatable, OR within the set) + "
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading