Skip to content

Replace "pending" with "incomplete" in todos output; omit from default view#327

Merged
jeremy merged 5 commits intomainfrom
fix/todos-pending-label
Mar 16, 2026
Merged

Replace "pending" with "incomplete" in todos output; omit from default view#327
jeremy merged 5 commits intomainfrom
fix/todos-pending-label

Conversation

@jeremy
Copy link
Copy Markdown
Member

@jeremy jeremy commented Mar 16, 2026

Summary

  • Rename the user-facing label for incomplete todos from "pending" to "incomplete" in filter values, TUI help hints, empty-state messages, and skill docs
  • Accept --status incomplete as the new canonical filter value, keeping pending as a backward-compatible alias
  • Normalize "incomplete""pending" before passing to the SDK on the single-todolist path (the SDK documents "pending" as the accepted value)
  • Omit the completed label entirely for incomplete todos in styled/markdown output — incomplete is the default state, so showing it on every row is noise. "done" still appears when a todo is completed. JSON/agent output is unaffected (raw boolean)

Notes

  • The cross-todolist aggregation path fetches todos without a status filter and filters client-side, so it handles both values without SDK involvement
  • The empty.NoTodos() change ("incomplete", "pending" case) is forward-looking — no caller currently passes a status context string

Test plan

  • bin/ci passes (unit tests, e2e, skill drift, surface snapshot)
  • basecamp todos list --status incomplete --in <project> filters correctly
  • basecamp todos list --status incomplete --list <id> --in <project> works (single-list path)
  • basecamp todos list --status pending --in <project> still works (backward compat)
  • Detail view omits "Completed" field for incomplete todos, shows "Completed: done" for completed ones

jeremy added 2 commits March 16, 2026 00:35
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.
@jeremy jeremy requested a review from a team as a code owner March 16, 2026 07:35
Copilot AI review requested due to automatic review settings March 16, 2026 07:36
@github-actions github-actions bot added commands CLI command implementations tui Terminal UI tests Tests (unit and e2e) skills Agent skills output Output formatting and presentation enhancement New feature or request breaking Breaking change labels Mar 16, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 16, 2026

⚠️ Potential breaking changes detected:

  • Renamed the status flag option value 'pending' to 'incomplete' in todos output, which is a breaking change for scripts or users relying on the previous value.

Review carefully before merging. Consider a major version bump.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 pendingincomplete and adjust presenter tests accordingly.
  • Update TUI short-help and empty-state messaging to display “incomplete”.
  • Update todos list flag help text and adjust cross-list filtering to treat pending as an alias of incomplete.

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 incomplete is now advertised, but the value is passed through to basecamp.TodoListOptions.Status in the single-todolist path (via fetchTodosIncludingGroups). The Basecamp API/SDK status filter appears to only support values like completed (and historically pending), so sending incomplete will likely break basecamp 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., map incomplete/pending to 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.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

jeremy added 2 commits March 16, 2026 00:42
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.
Copilot AI review requested due to automatic review settings March 16, 2026 07:53
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 incomplete handling, including single-todolist normalization to pending for 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.
Copilot AI review requested due to automatic review settings March 16, 2026 08:12
@jeremy jeremy force-pushed the fix/todos-pending-label branch from 919104d to 3c9854c Compare March 16, 2026 08:12
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 to pending before 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.

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@jeremy jeremy changed the title Replace "pending" label with "incomplete" in todos output Replace "pending" with "incomplete" in todos output; omit from default view Mar 16, 2026
@jeremy jeremy merged commit fc3850a into main Mar 16, 2026
30 checks passed
@jeremy jeremy deleted the fix/todos-pending-label branch March 16, 2026 19:54
jeremy added a commit to brianevanmiller/basecamp-cli that referenced this pull request Mar 18, 2026
…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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Breaking change commands CLI command implementations enhancement New feature or request output Output formatting and presentation skills Agent skills tests Tests (unit and e2e) tui Terminal UI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants