Skip to content
Merged
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
47 changes: 47 additions & 0 deletions src/keboola_agent_cli/changelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,53 @@
"`auth login` instead. Stores the resulting session in `auth.json` exactly like "
"`auth login` does -- same downstream command support, same "
"`--register-projects` contract.",
"New: a `kbagent-promotion-pipeline` skill that generates a from-scratch GitHub "
"Actions setup promoting configurations from a SOURCE project (dev) to a "
"DESTINATION project (prod), with a human-reviewed PR gate in between. `sync` "
Comment on lines +43 to +45

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 New release note's one-line summary gets cut off mid-sentence

The new promotion-pipeline release note opens with a sentence far longer than the summary width (src/keboola_agent_cli/changelog.py:43-45), so the default one-line view renders it as "... promoting configurations from a SOURCE project (dev) to a …" -- the cut lands before the point of the change.
Impact: Anyone reading the release notes (or the post-update "What's new" banner) sees a truncated, incomplete description of the new skill instead of a self-contained summary.

Headline extraction and the 160-character cap

The authoring contract in this file's docstring (src/keboola_agent_cli/changelog.py:15-16) and CONTRIBUTING step 2 of "Releasing a new version" require each bullet to "lead with a self-contained first sentence" because that sentence becomes the default summary. headline() (src/keboola_agent_cli/changelog.py:2057-2081) takes the first sentence and truncates it to CHANGELOG_HEADLINE_MAX_CHARS = 160 (src/keboola_agent_cli/constants.py:492). Rendering the new entry yields 152 characters ending in "to a …", i.e. the PR gate / destination half of the sentence -- the actual value of the change -- is dropped in kbagent changelog (non---full) and in format_whats_new().

Prompt for agents
The new 0.84.0 bullet for the promotion-pipeline skill opens with a sentence longer than 160 characters, so headline() truncates it mid-clause ("... from a SOURCE project (dev) to a …") in the default `kbagent changelog` view and in the post-update "What's new" banner. The changelog authoring contract (module docstring, plus CONTRIBUTING "Releasing a new version" step 2) requires the first sentence to be self-contained because it becomes the summary. Rewrite the bullet so its first sentence fits within CHANGELOG_HEADLINE_MAX_CHARS (160) while still naming the skill and what it does end-to-end (e.g. a short "New (#560): a `kbagent-promotion-pipeline` skill that scaffolds a PR-gated dev -> prod promotion pipeline in GitHub Actions." followed by the current detail as subsequent sentences). Verify with `headline()` that the result is not truncated.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

"targets one registered alias per invocation -- it has no 'this git branch is bound "
"to that project' magic -- so the skill builds the promotion loop out of that "
"primitive: a pull workflow syncs the source project into a scratch directory and "
"opens one PR against `main`, a validate workflow runs `sync push --dry-run` against "
"the DESTINATION token on that PR (the cross-project diff: if this merges, here is "
"exactly what changes in prod), and a push workflow applies it on merge -- one job "
"per pipeline, each gated by the `prod` GitHub Environment, so approving one "
"pipeline never approves another. Pull deliberately goes through a scratch "
"directory: the tracked directory's manifest is bound to the DESTINATION's config "
"ids, and overwriting it with the source's would make every push create duplicates "
"instead of matching the configs it already created. Handles multi-pipeline repos "
"and documents the GitHub secrets/environment setup. For porting an EXISTING `kbc` "
"repo, use `kbagent-cicd-migration` instead -- this one is for greenfield.",
"Fix (#568): `kbagent lineage show --upstream/--downstream <bucket>.<table>` warns "
"when an unqualified table id exists in more than one project. The help text has "
"promised 'auto-resolves, warns if ambiguous' since the command shipped, but no "
"warning was ever implemented -- the resolver returned the alphabetically first "
"project's copy and exited 0. With a bucket shared or linked across projects that "
"answered 'what depends on this table?' with one project's edges presented as the "
"whole picture, and the only clue was the fully-qualified `node` field in the "
"output. The first candidate is still what gets rendered, so nothing changes for "
"unambiguous ids, but the result now carries `ambiguous_matches` plus a `warnings` "
"entry naming every project that has the table and the `PROJECT:<bucket>.<table>` "
"form to query a specific one. In `--json` the warnings ride along in the payload, "
"`kbagent serve` returns them on `POST /lineage/show` and `GET /lineage/walk`, and "
"both diagram renderers carry the note as well (#584): the flowchart as a "
"standalone warning node, the ER view as a relationship-less `note` entity, so a "
"Web UI or `--format mermaid`/`er` reader is not left with one project's answer "
"looking like the whole picture. Note the remedy says `PROJECT:` rather than the "
"angle-bracket placeholder you might expect -- mermaid renders an escaped "
"`<project>` back to a literal tag that the browser then drops, quietly eating the "
"part that makes the advice usable.",
'Fix (#569): `kbagent search "<term>" --search-type config-based` matches '
"case-insensitively, the way the same command's textual mode always has. Keboola "
"configs routinely spell one logical table several ways -- a mixed-case row or "
"display name against the all-caps physical table id a DB-sourced extractor writes "
"into `storage.input.tables[].source` -- so a case-sensitive body scan answered 'is "
"this referenced anywhere?' with a false no, and the reporter's two queries differing "
"only in casing returned 5 vs 13 results org-wide, the shorter one missing an "
"actively-scheduled daily transformation. Nothing warned, and there was no "
"workaround: `--regex` is rejected in combination with `--search-type config-based`, "
"so not even a `(?i)` pattern was available on this surface. `kbagent config search` "
"is a different command and is unaffected -- it stays case-sensitive by default and "
"keeps its own `--ignore-case` for callers that need exact matching.",
],
"0.83.0": [
"Note (#390): there will be NO `kbagent agent migrate-mcp-tasks` command. Migrating "
Expand Down