# Web CLI Parity — Requirements Spec **Status:** Draft **Last updated:** 2026-02-19 **Related:** [`cli-ux-improvements.md`](cli-ux-improvements.md) — CLI UX improvements being developed in parallel. Features marked with **(CLI dep)** depend on or benefit from CLI-side work landing first. This document covers the features the CLI exposes that the web frontend does not. Each section maps a CLI capability to a proposed web feature, with acceptance criteria and priority. --- ## Problem Statement The opal CLI is the primary interface and offers rich task management: in-place editing, start/stop timers, detailed task info, project/tag browsing, bulk operations, and full sync controls. The web frontend currently only supports create, complete, delete, and report-based listing. Users who switch between CLI and web hit a wall — most tasks that go beyond "add" and "done" require falling back to the terminal. --- ## Tier 1 — Core Gaps (the web feels broken without these) ### 1.1 Task Detail View (`info` equivalent) **CLI:** `opal info 2` shows every field on a task — UUID, status, description, urgency, priority, project, all timestamps (created, modified, started, ended, due, scheduled, wait, until), recurrence pattern, parent UUID, and tags. **Web gap:** Tapping a task does nothing. There is no way to see a task's full state. **User story:** As a user, I want to tap a task to see all of its fields so that I can understand its full context without switching to the CLI. **Acceptance criteria:** - Given a task in the list, when I tap it, then a detail view opens showing every non-null field on the task - Given a task with a recurrence pattern, when I view its detail, then the recurrence interval and parent template link are visible - Given a task with scheduled/wait/until dates, when I view its detail, then those dates are displayed with labels - Given a task detail view, when I tap outside or press a close/back control, then the detail view closes and the list is restored **Interaction:** Bottom sheet — slides up from the bottom of the screen. Natural on mobile, avoids a route change, and leaves the task list partially visible behind it. Light-dismiss (tap scrim to close). **Priority:** MUST --- ### 1.2 Task Editing (`modify` / `edit` equivalent) **CLI:** `opal 2 modify priority:H due:friday` changes attributes inline. `opal 2 edit` opens `$EDITOR` with all fields in a structured format. **Web gap:** There is no way to edit a task after creation. Users must delete and recreate to fix a typo or change a due date. **User story:** As a user, I want to edit any field on an existing task so that I can adjust it as my plans change. **Acceptance criteria:** - Given a task detail view, when I tap an editable field, then I can modify its value - Given I change a field and confirm, when the update succeeds, then the task list reflects the change - Given I change a field and confirm, when the update fails, then the error is shown and the original value is preserved - Editable fields: description, project, priority, due, scheduled, wait, until, tags, recurrence (on templates) - Read-only fields (displayed but not editable): UUID, created, modified, end, parent UUID, status **Implementation notes:** - Uses `PUT /tasks/:uuid` — already exists in the API - For tags, uses `POST /tasks/:uuid/tags` and `DELETE /tasks/:uuid/tags/:tag` — already exist - Field editing could be inline (tap field to edit) or form-based (edit mode that makes all fields editable). Inline feels lighter for single-field tweaks. **Priority:** MUST --- ### 1.3 Start / Stop Timer (`start` / `stop` equivalent) **CLI:** `opal 1 start` marks a task as actively being worked on (sets `start` timestamp). `opal 1 stop` clears it. The `active` report lists started tasks. **Web gap:** The API endpoints (`POST /tasks/:uuid/start`, `POST /tasks/:uuid/stop`) are wired in `endpoints.js` but there are no UI controls. The `active` report works in the report picker but users can't actually start tasks. **User story:** As a user, I want to mark a task as "in progress" so that I can track what I'm actively working on and see it in the Active report. **Acceptance criteria:** - Given a pending task, when I tap a start control, then the task's start time is set and it appears in the Active report - Given a started task, when I tap a stop control, then the start time is cleared - Given a started task, when I view it in the list, then there is a visual indicator that it is active (distinguishable from non-started tasks) - The start/stop action should be accessible from both the task row and the detail view **Interaction:** Swipe left to toggle start/stop — mirrors swipe right for complete. Also accessible from the detail view (1.1). No visible button on the task row. **Priority:** MUST --- ### 1.4 Uncomplete / Revert (`modify status:pending` equivalent) **(CLI dep)** — CLI is getting a dedicated `uncomplete` command and a generic `undo` (see [IMP-1](cli-ux-improvements.md#imp-1-undo--uncomplete)). The web feature should align with however the CLI exposes this so the mental model is consistent. **CLI:** `opal modify status:pending` reverts a completed task. IMP-1 proposes `opal uncomplete` and `opal undo` as dedicated commands. **Web gap:** Once a task is completed it disappears from the pending list. The only recovery is the `completed` report + CLI. This is also called out in `BUGS.md` as a missing feature. **User story:** As a user, I want to undo an accidental completion so that the task reappears in my pending list. **Acceptance criteria:** - Given a completed task (visible in the Completed report), when I tap an uncomplete action, then the task's status reverts to pending and it reappears in the pending list - Given I just completed a task, when I tap undo within a brief window (e.g. toast with undo button), then the task is reverted without navigating to the Completed report **Implementation notes:** - Uses `PUT /tasks/:uuid` with `{"status": "pending"}` — works today - The undo toast after completion is a UX nicety but not strictly required for parity - If CLI IMP-1 lands an undo log table, the web could use the same mechanism for a more robust undo (revert any action, not just completion) **Priority:** MUST --- ### 1.5 Delete Confirmation **(CLI dep)** — CLI is improving confirmation prompts to show matched tasks before confirming (see [IMP-3](cli-ux-improvements.md#imp-3-show-matched-tasks-in-confirmations)). The web confirmation should follow the same pattern. **CLI:** `opal delete` always prompts `Proceed? (y/N)` before deleting. IMP-3 proposes showing the affected task(s) in the confirmation. **Web gap:** Delete is instant with no confirmation. There is no undo. **User story:** As a user, I want a confirmation before deleting a task so that I don't lose work by accident. **Acceptance criteria:** - Given I trigger a delete action, when the confirmation appears, then I must explicitly confirm before the delete proceeds - Given I dismiss the confirmation, then the task is not deleted - The confirmation should show the task description (matching CLI IMP-3's approach of showing what will be affected) **Priority:** MUST --- ## Tier 2 — CLI Parity (brings the web up to feature-complete) ### ~~2.1 Projects View~~ — DEFERRED ### ~~2.2 Tags View~~ — DEFERRED Projects and tags browsing is deferred. The existing filter syntax (`project:foo`, `+tag`) covers this adequately for now. When filter autocomplete is added later, discoverability will improve without needing dedicated views. --- ### 2.3 Display All Date Fields on Task Items **CLI:** `opal info` and the table display show scheduled, wait, until, and start dates when present. The `waiting` report makes sense because you can see *when* the wait expires. **Web gap:** Only the due date is shown on task rows. Scheduled, wait, until, and start dates are invisible. Users can set them via CLI syntax in the input bar but can't see them afterward. **User story:** As a user, I want to see all relevant dates on a task so that I understand when it's scheduled, when it becomes visible, and when it expires. **Acceptance criteria:** - Given a task with a `scheduled` date, then a "Scheduled: " indicator appears on the task row - Given a task with a `wait` date, then a "Wait: " indicator appears - Given a task with an `until` date, then an "Until: " indicator appears - Given a task with a `start` time set, then an "Active since