feat(board): read the full agile board settings #146

Merged
Claude-Run merged 1 commit from feat/YT-92-board-show into main 2026-08-06 12:46:09 +02:00
Member

yt board show <BOARD> renders the agile board settings screen the web UI keeps behind Board settings: Overview (owner, backlog and its query, orphan handling, board status), Projects, Columns (the driving field plus each column's ordinal, resolved flag, WIP limits and field values), Swimlanes, Sprints, Estimation, Colour coding, Card fields, and Permissions, each as a labelled table. The board name is positional and falls back to the board config value the way yt sprint --board does, and --json emits the deserialized entity. An unknown name fails with the existing board '<name>' not found error rather than an empty table.

AgileBoard grows from the two-field stub board list uses into the typed Agile entity: owner, projects, column settings with WIP limits, swimlane settings, sprint settings, colour coding, card settings, estimation fields, backlog, orphan flags, visibility and update permissions, and status. The swimlane and colour-coding variants are $type-tagged enums with an Unknown arm, so a variant this instance never returned does not fail the whole read. Every added field is optional, so board list keeps its cheap id,name selector and its output shape.

api::get_board resolves the name through the existing resolve_board and reads /api/agiles/<id> with the full selector, then takes projects and sprints from their own pageable subresources because an entity read cannot page its nested collections (YT-83). The live shapes that diverge from the published Agile entity are recorded next to it: cardSettings is null on every board probed and its subresource 404s, swimlaneSettings.field is a CustomFilterField rather than a CustomField, explicitQuery survives disableSprints, AgileColumn.presentation is the comma-joined list of the column's field values, and status.id is the constant boardStatus.

The MCP mirrors the read as the read-only get_board tool, which rejects dry_run per YT-81. crates/yt-cli/tests/board_show.rs drives the real binary against a mock server for the happy path, the config-default path, the missing-board path, and the unknown-board error. The board-name resolution yt sprint carried moves to commands::board::resolve_board so both surfaces share one definition.

#YT-92

`yt board show <BOARD>` renders the agile board settings screen the web UI keeps behind Board settings: Overview (owner, backlog and its query, orphan handling, board status), Projects, Columns (the driving field plus each column's ordinal, resolved flag, WIP limits and field values), Swimlanes, Sprints, Estimation, Colour coding, Card fields, and Permissions, each as a labelled table. The board name is positional and falls back to the `board` config value the way `yt sprint --board` does, and `--json` emits the deserialized entity. An unknown name fails with the existing `board '<name>' not found` error rather than an empty table. `AgileBoard` grows from the two-field stub `board list` uses into the typed Agile entity: owner, projects, column settings with WIP limits, swimlane settings, sprint settings, colour coding, card settings, estimation fields, backlog, orphan flags, visibility and update permissions, and status. The swimlane and colour-coding variants are `$type`-tagged enums with an `Unknown` arm, so a variant this instance never returned does not fail the whole read. Every added field is optional, so `board list` keeps its cheap `id,name` selector and its output shape. `api::get_board` resolves the name through the existing `resolve_board` and reads `/api/agiles/<id>` with the full selector, then takes `projects` and `sprints` from their own pageable subresources because an entity read cannot page its nested collections (YT-83). The live shapes that diverge from the published Agile entity are recorded next to it: `cardSettings` is null on every board probed and its subresource 404s, `swimlaneSettings.field` is a `CustomFilterField` rather than a `CustomField`, `explicitQuery` survives `disableSprints`, `AgileColumn.presentation` is the comma-joined list of the column's field values, and `status.id` is the constant `boardStatus`. The MCP mirrors the read as the read-only `get_board` tool, which rejects `dry_run` per YT-81. `crates/yt-cli/tests/board_show.rs` drives the real binary against a mock server for the happy path, the config-default path, the missing-board path, and the unknown-board error. The board-name resolution `yt sprint` carried moves to `commands::board::resolve_board` so both surfaces share one definition. #YT-92
feat(board): read the full agile board settings
All checks were successful
Check / fmt + clippy + build + tests (pull_request) Successful in 46s
Create release / Create release from merged PR (pull_request) Has been skipped
474edd0dfa
`yt board show <BOARD>` renders the agile board settings screen the web UI keeps behind Board settings: Overview (owner, backlog and its query, orphan handling, board status), Projects, Columns (the driving field plus each column's ordinal, resolved flag, WIP limits and field values), Swimlanes, Sprints, Estimation, Colour coding, Card fields, and Permissions, each as a labelled table. The board name is positional and falls back to the `board` config value the way `yt sprint --board` does, and `--json` emits the deserialized entity. An unknown name fails with the existing `board '<name>' not found` error rather than an empty table.

`AgileBoard` grows from the two-field stub `board list` uses into the typed Agile entity: owner, projects, column settings with WIP limits, swimlane settings, sprint settings, colour coding, card settings, estimation fields, backlog, orphan flags, visibility and update permissions, and status. The swimlane and colour-coding variants are `$type`-tagged enums with an `Unknown` arm, so a variant this instance never returned does not fail the whole read. Every added field is optional, so `board list` keeps its cheap `id,name` selector and its output shape.

`api::get_board` resolves the name through the existing `resolve_board` and reads `/api/agiles/<id>` with the full selector, then takes `projects` and `sprints` from their own pageable subresources because an entity read cannot page its nested collections (YT-83). The live shapes that diverge from the published Agile entity are recorded next to it: `cardSettings` is null on every board probed and its subresource 404s, `swimlaneSettings.field` is a `CustomFilterField` rather than a `CustomField`, `explicitQuery` survives `disableSprints`, `AgileColumn.presentation` is the comma-joined list of the column's field values, and `status.id` is the constant `boardStatus`.

The MCP mirrors the read as the read-only `get_board` tool, which rejects `dry_run` per YT-81. `crates/yt-cli/tests/board_show.rs` drives the real binary against a mock server for the happy path, the config-default path, the missing-board path, and the unknown-board error. The board-name resolution `yt sprint` carried moves to `commands::board::resolve_board` so both surfaces share one definition.

#YT-92
Claude-Run deleted branch feat/YT-92-board-show 2026-08-06 12:46:09 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
pandoras-box/youtrack-cli!146
No description provided.