Replace "pending" with "incomplete" in todos output; omit from default view#327
Replace "pending" with "incomplete" in todos output; omit from default view#327
Conversation
The API uses active/completed but the CLI displayed "pending" for incomplete todos, which implies waiting/blocked rather than "not yet done." Update the schema boolean label, TUI help hints, skill docs, and all corresponding tests.
Update the status filter and empty-state message to recognize both "incomplete" (new canonical value) and "pending" (backward compat) so existing scripts don't break.
Review carefully before merging. Consider a major version bump. |
There was a problem hiding this comment.
Pull request overview
This PR updates the CLI/TUI/presenter user-facing terminology for not-yet-done todos from “pending” to “incomplete”, while intending to keep pending as a backwards-compatible status filter alias.
Changes:
- Update todo “completed=false” label in the presenter schema from
pending→incompleteand adjust presenter tests accordingly. - Update TUI short-help and empty-state messaging to display “incomplete”.
- Update
todos listflag help text and adjust cross-list filtering to treatpendingas an alias ofincomplete.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| skills/basecamp/SKILL.md | Updates skill documentation to show --status as completed/incomplete. |
| internal/tui/workspace/views/todos.go | Updates the TUI toggle hint label from “pending” to “incomplete”. |
| internal/tui/workspace/views/todos_test.go | Updates TUI hint assertion to “incomplete”. |
| internal/tui/empty/messages.go | Updates todo empty-state to say “No incomplete todos…”, accepting incomplete and pending contexts. |
| internal/presenter/schemas/todo.yaml | Changes boolean label for completed=false from “pending” to “incomplete”. |
| internal/presenter/presenter_test.go | Updates tests to assert “incomplete” output instead of “pending”. |
| internal/commands/todos.go | Updates --status help text and treats pending as alias of incomplete in the cross-list client-side filter path. |
Comments suppressed due to low confidence (1)
internal/commands/todos.go:274
--status incompleteis now advertised, but the value is passed through tobasecamp.TodoListOptions.Statusin the single-todolist path (viafetchTodosIncludingGroups). The Basecamp API/SDK status filter appears to only support values likecompleted(and historicallypending), so sendingincompletewill likely breakbasecamp todos list --list ... --status incomplete(server-side filtering) even though the cross-list path applies client-side filtering. Consider normalizing the flag before SDK calls (e.g., mapincomplete/pendingto empty status or to the API's expected value) and/or validating supported values with a clear usage error.
cmd.Flags().StringVarP(&flags.status, "status", "s", "", "Filter by status (completed, incomplete)")
cmd.Flags().BoolVar(&flags.completed, "completed", false, "Show completed todos (shorthand for --status completed)")
cmd.Flags().BoolVar(&flags.overdue, "overdue", false, "Filter overdue todos")
cmd.Flags().IntVarP(&flags.limit, "limit", "n", 0, "Maximum number of todos to fetch (0 = default 100)")
cmd.Flags().BoolVar(&flags.all, "all", false, "Fetch all todos (no limit)")
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bdd390eae1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
1 issue found across 7 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="internal/commands/todos.go">
<violation number="1" location="internal/commands/todos.go:611">
P1: The "incomplete" → "pending" alias is only applied in the `listAllTodos` client-side filter, not in the `fetchTodosIncludingGroups` SDK path. When `--list` is specified, `listTodosInList` passes the raw status to the API — so `--status incomplete --list <id>` sends an unrecognized value to the Basecamp API.
Normalize early in `runTodosList`, before either code path is entered.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
The single-todolist path passes the status string through to the SDK, which documents "pending" as the accepted value. Without this, --status incomplete would send an unrecognized value to the API on that path. The cross-todolist path already filters client-side.
Verify the single-list path normalizes "incomplete" to "pending" before the SDK call, and the cross-list path filters completed todos client-side when --status incomplete is given. Also rename the TUI test to match the updated "incomplete" terminology.
There was a problem hiding this comment.
Pull request overview
Updates the Basecamp CLI/TUI todo status terminology by renaming the user-facing “pending” label to “incomplete”, while keeping pending as a backward-compatible --status alias and normalizing to the SDK’s expected value where needed.
Changes:
- Renamed todo completion label output from “pending” → “incomplete” (presenter schema + related rendering tests).
- Added
--status incompletehandling, including single-todolist normalization topendingfor SDK/API calls and cross-todolist client-side filtering for both values. - Updated TUI help hints, empty-state copy, skill docs, and added/updated tests for the new status behavior.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| skills/basecamp/SKILL.md | Updates documented --status values to use “incomplete”. |
| internal/tui/workspace/views/todos_test.go | Updates TUI ShortHelp expectation to “incomplete”. |
| internal/tui/workspace/views/todos.go | Updates the TUI ShortHelp hint label from “pending” to “incomplete”. |
| internal/tui/empty/messages.go | Updates empty-state messaging to say “No incomplete todos…”, supporting both context strings. |
| internal/presenter/schemas/todo.yaml | Changes boolean label for completed=false from “pending” to “incomplete”. |
| internal/presenter/presenter_test.go | Updates presenter rendering tests to expect “incomplete” output. |
| internal/commands/todos_test.go | Adds tests ensuring --status incomplete normalizes to pending for single-list SDK calls and filters client-side in cross-list mode. |
| internal/commands/todos.go | Updates CLI flag help text and implements single-list status normalization + cross-list alias-aware filtering. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Incomplete is the default state of a todo — showing "incomplete" on every row in list/detail output adds noise without information. Use an empty label for the false case so the completed field only appears when noteworthy (i.e. "done"). JSON/agent output is unaffected since it uses the raw boolean, not the presenter label.
919104d to
3c9854c
Compare
There was a problem hiding this comment.
Pull request overview
Updates the CLI/TUI todo terminology and filtering so users see and can query for “incomplete” todos instead of “pending”, while keeping pending working as a backward-compatible alias and ensuring the single-todolist SDK call still receives the SDK-supported status value.
Changes:
- Renames user-facing “pending” wording to “incomplete” in CLI help/docs and TUI hints/empty states.
- Adds/validates behavior for
--status incomplete(including normalization topendingbefore SDK calls on the single-list path). - Updates presenter schema/tests and command tests to reflect the new status naming and filtering behavior.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| skills/basecamp/SKILL.md | Updates user documentation for --status flag terminology. |
| internal/tui/workspace/views/todos_test.go | Adjusts TUI help tests to expect “incomplete”. |
| internal/tui/workspace/views/todos.go | Updates the TUI short-help hint label from “pending” to “incomplete”. |
| internal/tui/empty/messages.go | Updates empty-state copy to say “No incomplete todos…”, while accepting both contexts. |
| internal/presenter/schemas/todo.yaml | Changes how incomplete status is rendered in the todo schema (completed=false label). |
| internal/presenter/presenter_test.go | Updates presenter tests around boolean labels and todo detail/markdown output expectations. |
| internal/commands/todos_test.go | Adds tests verifying --status incomplete normalization and cross-list client-side filtering. |
| internal/commands/todos.go | Updates --status help text, normalizes incomplete→pending for SDK calls, and treats both values equivalently in client-side filtering. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
1 issue found across 3 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="internal/presenter/schemas/todo.yaml">
<violation number="1" location="internal/presenter/schemas/todo.yaml:33">
P2: The `completed` false-label is now an empty string, so incomplete todos will display a blank status in the detail view. The previous value was already `"incomplete"`, which matches the PR's stated goal. If the intent is to show "incomplete" in the detail view (per the test plan), this should be preserved rather than blanked.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
…evanmiller/feature-gap-analysis * origin/main: Show full content in detail views instead of truncating at 40 chars (basecamp#338) Switch CODEOWNERS from sip to cli team (basecamp#346) Fix dock ordering and add --all flag to `projects show` (basecamp#333) Add file upload command to SKILL.md (basecamp#343) Replace "pending" with "incomplete" in todos output; omit from default view (basecamp#327) Add `--in` as global alias for `--project` (basecamp#334) Fix 3 post-QA issues on api command (basecamp#330) deps: bump the go-dependencies group with 2 updates (basecamp#331) Improve tool instance disambiguation format (basecamp#329) Fix emoji/CJK alignment in search results (basecamp#328)
Summary
--status incompleteas the new canonical filter value, keepingpendingas a backward-compatible alias"incomplete"→"pending"before passing to the SDK on the single-todolist path (the SDK documents"pending"as the accepted value)Notes
empty.NoTodos()change ("incomplete", "pending"case) is forward-looking — no caller currently passes a status context stringTest plan
bin/cipasses (unit tests, e2e, skill drift, surface snapshot)basecamp todos list --status incomplete --in <project>filters correctlybasecamp todos list --status incomplete --list <id> --in <project>works (single-list path)basecamp todos list --status pending --in <project>still works (backward compat)