feat(changelog): one-line summaries by default, --full to expand - #401
Merged
Conversation
`kbagent changelog` dumped one giant paragraph per version (0.57.0 was a single ~3 KB bullet), which made the command unscannable. Rendering: default mode now shows a one-line headline per version (the first note's first sentence) plus a dim `(+N more)` marker and a `--full` (-v) footer hint when detail is hidden. `--full` expands every note as before. The post-update "What's new" banner is summarised the same way. `BREAKING:` is now a recognised prefix (bold red); previously it got no prefix styling at all. Summarisation: new `changelog.headline()` extracts the first sentence, skipping periods inside version numbers (`0.57.0`) and abbreviations (`e.g.`), capped at `CHANGELOG_HEADLINE_MAX_CHARS` on a word boundary with a dangling-backtick guard. Data + authoring: the 0.57.0 entry is re-split from one mega-paragraph into five prefixed bullets as the reference example. The authoring contract (one logical change per bullet, recognised prefix, self-contained first sentence) lives in the changelog.py module docstring and CONTRIBUTING.md. No version bump: this ships in a later release PR. Docs synced: CLAUDE.md command list, AGENT_CONTEXT (context.py), commands-reference.md. Tests: tests/test_changelog_render.py (16 cases).
Addresses two findings from the Devin review of #401: - headline(): the `before.isdigit()` guard meant to skip version-number periods (0.57.0) was applied to all `[.!?]` terminators, so a digit before "!" or "?" (e.g. "exit code 5!") was wrongly suppressed as a sentence boundary. Scope the guard to periods only. - The 0.57.0 "Change (flow validation)" reference bullet led with a ~600-char first sentence, contradicting the very authoring contract this PR introduces. Split it into a tight 149-char first sentence so the example actually models the contract. Test: headline() digit-guard-is-period-only case added.
Member
Author
Devin review findings — addressed in e1c1249The 4 Devin findings live in the Devin app (not posted as GitHub inline threads), so there's nothing to resolve here — recording the disposition for reviewers:
|
padak
added a commit
that referenced
this pull request
Jun 4, 2026
#401 The 0.58.0 BigQuery note was a single wall-of-text bullet. #401 (merged to main) introduced the `kbagent changelog` one-line-summary view + an authoring contract (one logical change per prefixed bullet, self-contained first sentence). Reformat the entry into New:/Fix:/Change: bullets so the default `kbagent changelog` view stays scannable, and add a bullet documenting the #401 feature itself (it shipped to main without a version bump, so 0.58.0 is its release home).
padak
added a commit
that referenced
this pull request
Jun 4, 2026
* feat(workspace): BigQuery support for `workspace query` (0.58.0)
The Query Service backend now runs BigQuery (as keboola-mcp-server already
uses). The query execution path was always backend-agnostic -- submit + CSV
export are identical for Snowflake and BigQuery -- so a SELECT against a
BigQuery workspace already returned rows. The gaps were classification and
error legibility:
- qs_compatible is now keyed by (backend, loginType). BigQuery workspaces
carry loginType `default`, which IS Query-Service-compatible, but `default`
was off the Snowflake-only whitelist, so every BigQuery workspace was
reported qs_compatible=false and hidden by `workspace list --qs-compatible`.
New QUERY_SERVICE_COMPATIBLE_LOGIN_TYPES_BIGQUERY whitelist is kept separate
because Snowflake's legacy `default` is rejected ('JWT token is invalid') --
the same string means compatible for BigQuery, incompatible for Snowflake.
- workspace create on BigQuery now requests loginType `default` explicitly
(matches keboola-mcp-server) instead of relying on the backend default.
- BigQuery query errors are unwrapped: the Query Service serializes them as
{Location: ...; Message: "..."; Reason: ...}; _unwrap_bigquery_error extracts
the inner Message so the error reads like Snowflake plain text.
Verified live against project 9621 (e2e-bigquery, connection.keboola.com):
create/list/detail/load/query/delete, real-data query, qs_compatible surfacing,
and clean error messages.
Tests: TestBigQueryQueryServiceSupport, TestUnwrapBigQueryError + a BigQuery
case in TestExtractQueryJobError; test_e2e workspace query is now backend-aware
(BigQuery back-tick vs Snowflake double-quote quoting).
* docs(workspace): note BigQuery qs_compatible + backend-agnostic query (review NB-1)
Addresses the kbagent-pr-reviewer NB-1 finding: the commands-reference.md
workspace list/detail/query entries documented the #304 qs_compatible fields
but not the v0.58.0 backend-aware change. Without it, an agent on an older
install hitting a BigQuery project would get zero `--qs-compatible` results
with no explanation.
- workspace list / detail: note qs_compatible is keyed by (backend, loginType)
and BigQuery `default` workspaces are now qs_compatible=true (Snowflake's own
legacy `default` stays false).
- workspace query: note it is backend-agnostic since v0.58.0 and the
Snowflake double-quote vs BigQuery back-tick dialect difference.
* docs(changelog): reformat 0.58.0 per #401 authoring contract + document #401
The 0.58.0 BigQuery note was a single wall-of-text bullet. #401 (merged to
main) introduced the `kbagent changelog` one-line-summary view + an authoring
contract (one logical change per prefixed bullet, self-contained first
sentence). Reformat the entry into New:/Fix:/Change: bullets so the default
`kbagent changelog` view stays scannable, and add a bullet documenting the
#401 feature itself (it shipped to main without a version bump, so 0.58.0 is
its release home).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
kbagent changelognow shows a one-line summary per version by default instead of a wall of text.--full(-v) expands every note as before.Before (0.57.0 was a single ~3 KB bullet):
After:
Why
The changelog data had drifted from its own contract ("one-line summaries per version") into multi-paragraph essays, and the renderer — though it word-wraps and colours prefixes — can't rescue a single 3 KB bullet. Two compounding problems: data (mega-paragraphs) and rendering (no summary view). This fixes both.
Changes
Rendering (
commands/changelog.py)(+N more)+ a--fullfooter hint when detail is hidden.--full/-v: full notes, word-wrapped (previous behaviour).BREAKING:(bold red) in_PREFIX_STYLES+_PREFIX_RE— previously it got no prefix styling.--fullbound viafunctools.partialso the--jsonpayload stays{entries}only (flag is presentation, not data).Summarisation (
changelog.py)headline(): first sentence, capped atCHANGELOG_HEADLINE_MAX_CHARSon a word boundary, with guards so periods inside version numbers (0.57.0) and abbreviations (e.g.) aren't read as sentence ends, plus a dangling-backtick cleanup.format_whats_new(post-update banner) now summarises the same way.Data + authoring
changelog.pymodule docstring andCONTRIBUTING.md.Config:
CHANGELOG_HEADLINE_MAX_CHARS = 160inconstants.py(no hardcoded literal in the renderer).Docs synced:
CLAUDE.mdcommand list,AGENT_CONTEXT(context.py),commands-reference.md.Tests
tests/test_changelog_render.py(16 cases):headline()guards (version-number, abbreviation, truncation, dangling backtick), summary vs--full,(+N more), BREAKING styling, clean JSON payload,format_whats_newsummarisation.Notes for reviewers
make typecheckbaseline (47 pre-existing diagnostics) is unchanged; none touch the changed files.🤖 Generated with Claude Code