Skip to content

Next#52

Open
twmb wants to merge 74 commits intomasterfrom
next
Open

Next#52
twmb wants to merge 74 commits intomasterfrom
next

Conversation

@twmb
Copy link
Copy Markdown
Owner

@twmb twmb commented Mar 20, 2026

No description provided.

twmb and others added 30 commits February 25, 2026 16:15
Use kmsg.ControlRecordKey and kmsg.EndTxnMarker types instead of manual
kbin parsing for transactional control records. Add support for newer
fields in __consumer_offsets (OffsetCommitValue v4 TopicID,
ConsumerMemberMetadata v2 Generation, v3 Rack, fix OwnedPartitions to
v1+ instead of only v1) and __transaction_state (TxnMetadataValue v1
PreviousProducerID, NextProducerID, NextProducerEpoch,
ClientTransactionVersion).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- configs: "inlcude" -> "include" in --with-docs and --with-types flag descriptions
- misc: "incompatable" -> "incompatible" in probe-version short description
- txn: "Describe producers quotas." -> "Describe active producers."

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add --type-filter flag (mapped to ListGroupsRequest.TypesFilter) to
filter groups by type (Classic, Consumer; Kafka 3.0+). Add GROUP-TYPE
column to the table output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the metadata response version is >= 7 (Kafka 2.1.0+), print the
leader epoch after the leader ID in the detailed partition output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add list (ListTransactions) and describe (DescribeTransactions) commands
to the txn subcommand group.

- list: sharded request to all brokers, with --state and --producer-id
  filter flags
- describe: takes transactional IDs as args, shows state, producer info,
  timeout, start timestamp, and involved topics/partitions

Also fix typo in describe-producers short description.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- describe: uses ApiVersionsRequest to print supported and finalized
  feature version ranges (Kafka 3.3+)
- update: uses UpdateFeaturesRequest to update finalized feature flags;
  requires --run safety flag, supports --validate-only

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- describe-cluster: DescribeClusterRequest with --include-authorized-ops
  flag, prints cluster ID, controller, and broker table
- describe-quorum: DescribeQuorumRequest for __cluster_metadata:0, prints
  leader/epoch/high-watermark and voter/observer replica states
- Register features subcommand

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…subcommands

Add share group support (KIP-932, Kafka 4.0+) with subcommands:
- list: list share groups (alias for group list --type-filter share)
- describe: describe share groups via ShareGroupDescribe (API key 77)
- delete: delete share groups (alias for group delete)
- describe-offsets: describe share group start offsets (API key 90)
- alter-offsets: alter share group start offsets (API key 91)
- delete-offsets: delete share group offsets for topics (API key 92)

Registered under both "admin share-group" and top-level "share-group" / "sg".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add --consumer-protocol flag to group describe for KIP-848 consumer
  groups (Kafka 4.0+), using ConsumerGroupDescribe API (key 69). Shows
  member epochs, target assignments, subscribed topics, and assignor.
- Filter listGroups to ["classic", "consumer"] so bare "group describe"
  doesn't try to describe share groups with the wrong API.
- Add listGroupsByType helper for type-filtered group listing.
- Update --type-filter help text to include Share.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
shardFail already increments *failures, so the extra failures++ caused
each shard error to be counted twice. This meant the "all N requests
failed" guard never triggered when all shards failed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Switch from RequestWith to RequestSharded so that multi-group requests
with different coordinators are handled correctly, and partial shard
failures show results from successful coordinators instead of dying.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shared parser for offset specifications used by consume --offset,
group seek --to, share-group seek --to, and topic trim-prefix --offset.

Offset syntax: start, end, start+N, end-N, +N, -N, N, N:M, :N, N:end,
:end, :end+N, :end-N.

Timestamp syntax (@-prefixed): numeric (ns/ms/s by digit count),
YYYY-MM-DD, RFC3339, -duration, +duration. Ranges via @t1:T2 with
positive durations relative to T1. Custom duration parser supports 'd'
(days) in addition to Go's standard units.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add global --format flag (text, json, awk) to replace --dump-json/-j.
The old flag is marked deprecated but still works by mapping to json.

- text: current tabwriter output (default)
- json: structured JSON with _command and _version metadata
- awk: tab-separated values without headers

Add FormattedTable helper in out/ that buffers rows and flushes in the
requested format. Add MarshalJSON for commands with non-tabular output.

Wire into group list (tabular pattern) and describe-cluster (mixed
pattern with structured JSON) as proof of concept.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Flatten the admin namespace by promoting all subcommands to top-level:
acl, config, quota, dtoken, logdirs, reassign, user, txn.

Renames with backward-compatible aliases:
- partas → reassign (alias: partas)
- user-scram → user (alias: user-scram)
- client-quotas → quota (alias: client-quotas)
- configs → config (alias: configs)
- acl describe → acl list (aliases: ls, describe, d)

Create cluster command with info (metadata), describe-cluster,
describe-quorum, elect-leaders, and features subcommands.

Mark admin as hidden+deprecated. Mark top-level metadata as
hidden+deprecated in favor of cluster info. All old command paths
continue to work.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the hand-written offset parser with the shared offsetparse
package. This adds support for all new offset formats:

- @timestamp: unix timestamps (ns/ms/s), YYYY-MM-DD, RFC3339, durations
- @t1:T2: timestamp ranges with relative-to-T1 durations
- +N/-N: relative offsets (forward from start, backward from end)
- N:M, :N, N🔚 offset ranges with colon separator
- :end+N, :end-N: until-end with delta

Timestamp start offsets are resolved via kadm.ListOffsetsAfterMilli
and applied using kgo.Client.SetOffsets. Timestamp end offsets use the
existing untilOffsets/PauseFetchPartitions mechanism.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New `group seek GROUP --to VALUE` command that adjusts committed offsets
for a consumer group. The group must be Empty or Dead.

Supports all offset specifications via the shared parser:
- start/end: earliest/latest offsets
- +N/-N: relative to current committed offset
- N: exact offset
- @timestamp: resolved via ListOffsetsAfterMilli

Includes approval phase: preview table shown before committing.
Flags: --dry-run (preview only), --execute (skip prompt), --topics
(filter to specific topics).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New `share-group seek GROUP --to VALUE --topics TOPICS` command that
adjusts start offsets for a share group via AlterShareGroupOffsets.

Supports start, end, exact offset N, and @timestamp specifications.
Does not support +N/-N relative offsets (share groups have start
offsets, not committed offsets).

Includes the same approval phase as group seek: preview table,
--dry-run, --execute, and interactive confirmation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add -G FILTER / --grep FILTER flag (repeatable) for filtering consumed
records. Multiple filters are AND'd.

Filter DSL:
  k:REGEX      match record key
  v:REGEX      match record value
  hk:REGEX     match any header name
  hv:REGEX     match any header value
  h:NAME=REGEX match a specific header's value
  t:REGEX      match topic name

Prefix with ! to negate: !v:warning excludes records matching "warning".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Overhaul group describe to always fetch offsets and show lag in the
default output. The previous non-verbose output (broker, state, proto)
is redundant with group list.

New flags:
- -s/--summary: show only summary section
- -m/--members: show only members section
- -l/--lag: show only lag section
- --lag-per-topic: aggregate lag per topic
- --lag-filter EXPR: filter by lag (>N, >=N, <N, <=N, =N)

Other improvements:
- Show total lag in summary section
- Include committed-but-unassigned partitions in lag output
- Also list offsets for partitions with commits (not just assignments)
- Replaced interface{} closure chain with struct-based describeRow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New `topic describe TOPICS...` showing unified topic information:
- Summary: topic name, ID, partition count, replication factor
- Partition table: leader, epoch, replicas, ISR, offline replicas
- Configs (with -c or -a): key, value, source, sensitivity

Health filters for ops:
- --under-replicated: ISR < replicas
- --unavailable: no leader
- --under-min-isr, --at-min-isr: ISR vs min.insync.replicas

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Consume:
- --print-control-records: include transaction markers in output
- --fetch-max-partition-bytes: per-partition byte limit for fetches
- --timeout: exit if no message received for the given duration

Produce:
- --delivery-timeout: per-record delivery timeout
- --max-message-bytes: max record batch size
- --allow-auto-topic-creation: auto-create missing topics
- -o/--output-format: replaces --verbose-format (renamed)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
topic create: --if-not-exists suppresses TOPIC_ALREADY_EXISTS error.
topic delete: --if-exists suppresses UNKNOWN_TOPIC_OR_PARTITION error.
topic list: -i/--internal includes internal topics, --regex filters by pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add --help-json global flag that dumps the entire command tree as JSON,
including command names, descriptions, aliases, flags (type, default,
description), and nested subcommands. Hidden/deprecated commands are
included with a deprecated field.

An LLM agent can call "kcl --help-json" once to ingest the full CLI
surface without recursively running --help on every subcommand.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extend the config file format to support named profiles:

  current_profile = "production"
  [profiles.production]
  seed_brokers = ["kafka-prod:9092"]
  [profiles.local]
  seed_brokers = ["localhost:9092"]

Old flat configs (no [profiles] section) continue to work unchanged.

Add global --profile/-C flag to override the active profile for a
single command (e.g., kcl -C staging group list).

New myconfig subcommand: profile (use, list, current, rename, delete).

Also add lag filter parser tests for group describe.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Group seek tests (kfake):
- TestSeekResolveStartEnd: verify ListStartOffsets/ListEndOffsets
- TestSeekCommitAndVerify: produce, commit, seek to start, verify
- TestSeekRelativeOffset: parse -5, compute relative from committed

Consume grep test (kfake):
- TestGrepFilterWithKfake: produce records with keys/headers, verify
  key filter, value filter, combined AND filter, header filter

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add --from-file flag to load topic/partition pairs from a JSON file:

  [{"topic": "foo", "partition": 1}, {"topic": "bar", "partition": 0}]

Can be combined with the existing -t flag syntax.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New commands for managing KRaft quorum voters:
- cluster add-controller: add a voter with --controller-id, --directory-id,
  and --listeners flags
- cluster remove-controller: remove a voter with --controller-id and
  --directory-id flags

Uses AddRaftVoter/RemoveRaftVoter APIs (Kafka 4.0+).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add -v/--verbose flag to share-group describe that joins with
DescribeShareGroupOffsets to show start offsets and lag per partition
alongside the member assignment table.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
topic alter-config: new porcelain using IncrementalAlterConfigs with
clean --set, --delete, --append, --subtract flags and --dry-run.

user: rename describe to list (with describe/d aliases for compat).

share-group describe -v: show start offsets and lag per partition by
joining with DescribeShareGroupOffsets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Group describe kfake tests:
- TestDescribeLagComputation: produce records, commit offset, verify
  lag = end - committed
- TestParseLagFilterIntegration: verify lag filter with computed values

Topic describe kfake tests:
- TestTopicDescribeMetadata: create 3-partition topic, verify metadata
- TestTopicDescribeConfigs: create topic, verify config fetching works
- TestInt32sToString: unit test for helper function

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
twmb and others added 30 commits March 18, 2026 20:58
…Reader

Replace kcl's custom format/parse_out.go and format/parse_in.go with
kgo.NewRecordFormatter and kgo.NewRecordReader from franz-go. These APIs
support many more features: attributes, unpack, base64raw, hex numbers,
bool, regex input, json input, etc.

- Remove --escape-char / -c flag (always uses % now, matching kgo)
- Remove --max-delim-buf flag (kgo handles buffering internally)
- Replace format.ParseWriteFormat with kgo.NewRecordFormatter
- Replace format.NewReader with kgo.NewRecordReader
- Replace static ParsesTopic() check with runtime r.Topic == "" check
- Delete the entire format/ package (parse_out.go, parse_in.go, common.go)
- Update consume and produce help text to document kgo formatter capabilities
- Remove go-strftime dependency (now handled inside kgo)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reformat unpack syntax into a clean categorized layout. Expand number
formatting to list each hex/big/little variant on its own line. Add
output-format documentation to produce with cross-reference to consume.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename 'kcl cluster info' to 'kcl cluster metadata' as the primary name,
keeping 'info' as a backwards-compatible alias.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Always fetch and display the last stable offset (LSO) alongside start
and end offsets. The stable offset shows how far read_committed consumers
can read; when it differs from end, there is an open transaction.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add hidden `kcl topic consume` and `kcl topic produce` subcommands as
aliases for the top-level `kcl consume` and `kcl produce` commands.
This aids discoverability for users exploring the topic subcommand tree.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add %D (delivery count) and %A (acquisition deadline) to consume help
text — these are new share group format verbs added to franz-go.

Add -t/--topic flag to produce as an alternative to the positional
topic argument, matching kafkacat/kcat conventions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrite format documentation for both consume and produce to closely
follow the franz-go RecordFormatter and RecordReader godoc. Each format
option is on its own line. All modifiers are documented with concrete
examples.

Consume additions:
- %d also accepts number formatting in braces (e.g., %d{big64})
- Delimiter rules for strftime/go (pounds, braces, brackets)
- Time is always in UTC
- Unpack error behavior documented
- %a ";number" suffix accepts any number format
- %a{timestamp-type} explains pre-0.10 records

Produce additions:
- Sized verbs must occur before what they size
- JSON values are compacted after reading
- Concrete examples for hex/base64/json text decoding
- Regex text matching documented
- Timestamps can only be read as numbers (not strftime/go)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…nt for -o end

Add two missing config resource types to config alter/describe:
  g,  group           group configuration (Kafka 4.0+)
  cm, client-metrics  client metrics subscription (Kafka 3.7+)

This enables e.g. kcl config alter my-share -tg -s share.auto.offset.reset=earliest

Also update config examples to use new --set/--delete flags instead of
deprecated --kv syntax, and add examples for the new entity types.

Print a stderr hint when consuming from end of topic so users know
the command is not hung while waiting for new records.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- sg describe: always show offsets/lag (was behind --verbose), add
  --summary flag with TOTAL LAG line, remove -v flag
- sg delete: add --dry-run and --regex flags (matching group delete)
- sg seek: add --to-file for per-partition offsets from JSON file
  (matching group seek), make --topics optional with --to-file
- sg offset-delete: rename from delete-offsets to match group's
  offset-delete naming
- Delete describe-offsets command (folded into describe)
- Delete alter-offsets command (redundant with seek --to-file)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace out.Die/out.MaybeDie with returned errors across all commands.
Commands now use cobra RunE instead of Run, and return fmt.Errorf
instead of calling out.Die. Helper functions that previously called
out.Die now return errors to their callers.

The out package gains:
- ExitCodeError type for errors with specific exit codes
- Errf() to create ExitCodeError values
- HandleError() for format-aware error output (JSON when --format json)

main.go calls out.HandleError on the error from root.Execute(), which
formats the error as JSON or plain text depending on --format.

out.Die and out.MaybeDie remain (marked deprecated) for use in
goroutines and callbacks where returning an error is not possible:
- consume goroutine and EachPartition callbacks
- produce Produce callback
- transact/transactMirror goroutines
- client bootstrap code
- voter/admin DieJSON callbacks

68 RunE conversions across 33 files, ~290 out.Die/MaybeDie calls
converted to returned errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parse cmd.Example into an array of non-empty lines and include it in
the --help-json output. This makes examples programmatically accessible
for LLM-assisted usage and documentation generation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- consume_test.go: handle new (Offset, error) return from parseOffset
- describe_test.go: handle new (map, error) return from fetchTopicConfigs
- consume.go: defer cancel() to prevent context leak on early error
  returns after context.WithCancel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Convert ~90 error returns to use out.Errf with appropriate exit codes:

- ExitUsage (2): bad flags, missing required args, invalid combinations,
  unrecognized option values, mutually exclusive flags
- ExitNotFound (4): profile not found, group not found, no groups to
  describe, no topics to seek

All other errors remain as plain fmt.Errorf (defaulting to exit code 1).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove ExitAuth (3), ExitNotFound (4), ExitTimeout (5) — these aren't
useful enough to justify. An LLM reads error messages, not exit codes.
Shell scripts just need success/failure/bad-usage:

  0  success
  1  runtime error (Kafka, network, etc.)
  2  usage error (bad flags, missing args)

Convert all ExitNotFound calls back to plain fmt.Errorf (exit code 1).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Delete transact command entirely (unused, niche)
- Delete admin delete-records (superseded by topic trim-prefix which
  supports symbolic offsets and timestamps)
- Delete topic alter-config (use 'config alter -tt' instead, which
  handles all resource types uniformly)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Flag consistency fixes:

- Rename --dry to --dry-run in config alter and topic create
- Remove --run from elect-leaders, features update, quota alter;
  replace with --dry-run (execution is now the default, --dry-run
  previews without applying)
- features update: merge --run + --validate-only into single --dry-run
- Add --topic/-t flag to consume (matches produce, kafka scripts, rpk)
- consume now accepts topics via both positional args and -t flag

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
KIP-1071 isn't released yet (Kafka 4.1+). Remove the premature
streams-group list/describe/delete commands. Can be re-added when
the KIP ships and stabilizes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standardize all tab-writer table headers to use hyphens:
  LEADER EPOCH    → LEADER-EPOCH
  END OFFSET      → END-OFFSET
  OFFSET LAG      → OFFSET-LAG
  IS FUTURE       → IS-FUTURE
  GROUP ID        → GROUP-ID
  TOTAL LAG       → TOTAL-LAG
  ASSIGNMENT EPOCH → ASSIGNMENT-EPOCH
  TOPIC ID        → TOPIC-ID

This matches the convention already used by NewTable/NewFormattedTable
headers (e.g., CURRENT-OFFSET, LOG-END-OFFSET, MEMBER-ID).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… format

- Add --version flag to root command (set via ldflags -X main.version)
- Add -t/-g short flags to all ACL subcommands (list, create, delete)
- Add --header/-H to produce for attaching static headers to records
- Convert topic describe partition table to format-aware output
  (supports --format json|awk)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace raw BeginTabWrite/NewTable with FormattedTable across all
commands that output tabular data, so --format json|awk works everywhere:

- misc list-offsets, offset-for-leader-epoch
- logdirs describe (both aggregate and detailed paths)
- metadata brokers and topics tables
- group delete, group describe (lag and member tables)
- share-group list, delete, describe (members and offsets tables)
- topic trim-prefix result table
- topic list (via metadata.PrintTopics)

Remaining BeginTabWrite usage is in non-data contexts:
- consumer_offsets/transaction_state (internal topic decoders writing
  to buffers, not stdout)
- admin describe-cluster/describe-quorum (already have format switching;
  BeginTabWrite is in the text-only path)
- acl create/delete (informational pre/post output, not the main table)
- topic describe error lines

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move all non-data output (dry-run messages, confirmation prompts,
"no results" notices, error diagnostics) from stdout to stderr across
all commands. This ensures stdout contains only structured data when
using --format json or --format awk, making output safe for jq/awk.

Files updated: acl, admin, configs, features, group describe/seek,
share-group seek/sharegroup, topic, trim-prefix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- misc: broker error messages in list-offsets and offset-for-leader-epoch
- misc: verbose "trying" message in errtext
- myconfig: all confirmation messages (Switched, Renamed, Deleted, linked,
  unlinked, no symlink, no profiles, no profile set)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- configs: remove trailing period from "aborting." error message
- consume: print fetch errors to stderr via EachError (was silently
  swallowed with a TODO comment)
- main: remove stale TODO about removing cobra

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add unified --section flag to control which output section is displayed.
This replaces per-command section flags (--summary, --lag, --members,
--cluster, --brokers, --topics, --all).

Behavior per format:
  text: all sections by default, --section filters to one
  awk:  default "main" section, --section selects which
  json: always all sections (--section ignored)

Commands updated:

  group describe (sections: summary, lag, members)
    - Delete --summary, --lag, --members, --lag-per-topic, --lag-filter
    - JSON now includes lag/offset data (was missing entirely)
    - AWK defaults to lag section

  share-group describe (sections: summary, members, offsets)
    - Delete --summary
    - TOTAL-LAG moved to summary section
    - JSON now includes offsets/lag data (was missing)
    - AWK defaults to offsets section

  topic describe (sections: summary, partitions, configs)
    - AWK now supports --section configs and --section summary
    - AWK defaults to partitions

  cluster metadata (sections: cluster, brokers, topics)
    - Delete --cluster, --brokers, --topics, --all
    - AWK now supports all three sections
    - AWK defaults to topics

  describe-cluster (sections: cluster, brokers)
    - AWK now supports --section cluster
    - AWK defaults to brokers

  describe-quorum (sections: voters, observers)
    - AWK/text now filterable by section

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Run gofmt -w across all source files. Remove redundant --configs/-c
and --all/-a flags from topic describe (replaced by --section configs).
Update help text to reflect --section usage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
consume: "output format" -> "record output format"
produce: "record only delimiter" -> "record input format"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ExitJSON calls os.Exit(0) directly, bypassing cobra's RunE error
handling. Replace with DumpJSON (prints JSON, no exit) followed by
return nil, letting cobra handle the clean exit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Delete ExitJSON, ExitErrJSON, ExitCode, Exit, ErrAndMsg, MaybeExitErrMsg.
None of these are called anywhere in the codebase. Remove the kerr import
that was only needed by the deleted functions.

Remaining public API: Die, MaybeDie (deprecated, for goroutines/callbacks),
DumpJSON, HandleError, Errf, ExitCodeError, BeginTabWrite/To, NewTable,
NewTabWriter, NewFormattedTable, MarshalJSON, DieJSON.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the two DumpJSON callers (misc raw-req, acl create error path)
with MarshalJSON for consistent _command/_version metadata in all JSON
output. Delete DumpJSON and its encoding/json import from the out package.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant