3.2 KiB
Context
pcli is a Cobra-based CLI for the Planka project management API. Commands follow a pcli <resource> <action> pattern (e.g., pcli board get, pcli card list). The client layer already provides ListBoards() (via /api/projects) and GetBoard(id) (via /api/boards/:id), where GetBoard returns the board's lists and cards in the included block. Output is handled by output.Print() which dispatches to JSON envelope or table rendering based on the --format flag.
Goals / Non-Goals
Goals:
- Provide a single top-level
pcli statuscommand that summarizes all boards, their lists, and card counts - Reuse existing client methods with no new API endpoints
- Support both JSON and table output formats via the existing
--formatflag - Show open card counts as the primary number, with closed cards noted separately
Non-Goals:
- Concurrent/parallel board fetching (sequential is sufficient for expected board counts)
- Filtering by project, board, or list (this is a full overview command)
- Showing card-level detail (names, assignees, due dates) — that's what
card listis for - Caching or incremental updates
Decisions
1. Top-level command, not a subcommand
The status command will be registered directly on rootCmd, not under board or any other resource group. It's a cross-cutting summary, not a resource operation.
Alternative considered: pcli board status — rejected because the command spans all boards and is conceptually similar to git status as a quick overview.
2. Data aggregation in the command layer
The status command will call ListBoards() then GetBoard(id) for each board, aggregating card counts per list in the command handler. No new client method is needed.
Alternative considered: A dedicated client.GetStatus() method — rejected because there's no single Planka API endpoint for this; the aggregation is purely a CLI concern.
3. New model types for status data
A StatusSummary struct will hold the aggregated data, containing a slice of BoardSummary structs (board name + list summaries), each containing a slice of ListSummary structs (list name, open count, closed count). This gives both JSON and table formatters a clean data structure to work with.
Alternative considered: Reusing existing Board/List types with card slices — rejected because the status output is a derived summary, not raw API data.
4. Table output uses per-board sections
In table format, each board is rendered as a headed section with a list/cards table beneath it. A total board count line appears first. This matches the natural reading pattern for a summary view.
5. JSON output uses the standard envelope
JSON output wraps the StatusSummary in the existing {"data": ..., "error": null} envelope, consistent with all other commands.
Risks / Trade-offs
- N+1 API calls — One
ListBoardscall plus oneGetBoardper board. For typical usage (< 20 boards) this is fine. If it becomes a problem, concurrent fetching can be added later without changing the interface. → Mitigation: defer optimization until needed. - Stale data between calls — Board state could change between sequential
GetBoardcalls. → Mitigation: acceptable for a summary view; not a transactional operation.