generated from eblume/project-template
Phase 1: v1 prototype #1
2 changed files with 61 additions and 6 deletions
docs: plan the filter-views slice + TUI coherence; note chores rework
Some checks failed
Build / validate (pull_request) Failing after 8m9s
Some checks failed
Build / validate (pull_request) Failing after 8m9s
- tech-spec §8.2 (new): filter-views slice — extend `list` to a data-expressed predicate (attention set, project-subtree/multi scope, exclude-projects, actionable toggle), five built-in views (`heph view <name>`) seeded from the owner's verbatim Todoist queries; the TUI's filter pane reuses them - tech-spec §8.1: TUI filter pane = the §8.2 views; depends on that slice - tech-spec §14: filter-views is the next slice (before heph-tui); CLI + daemon-service marked done - design §6.2.1: record the verbatim filter queries + the reference-context → wiki reclassification, and note future direction: chores as a first-class feature (own do-date/recurrence; retire Chores/Camano-Chores projects) and dropping the Schedule filter (time-of-day not modeled) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
commit
eb4a827700
|
|
@ -274,6 +274,26 @@ The owner's old rule — "avoid ncurses and interactive UIs; write atomic code a
|
|||
- **Natural-language recurrence** — 95/107 dated tasks recur, expressed as `every 3 days`, `every 6 months`, `every workday`, `every April 15`, `every other wed`. heph stores RFC-5545 RRULE; capture should accept the common NL forms and compile them (the easy subset; time-of-day like "at 08:00" deferred — heph's `do_date` is date-grained for ranking).
|
||||
- **Tags are noise** — 7 labels, **5 task-uses across 387**. Confidently **defer** a tag surface; it is not load-bearing.
|
||||
|
||||
**The saved filters, verbatim (the basis for heph's filter views, [[tech-spec]] §8.2):**
|
||||
|
||||
| Filter | Todoist query |
|
||||
|---|---|
|
||||
| Top of Mind | `(p1\|p2) & (no date \| today \| overdue)` |
|
||||
| Schedule | `(today \| overdue) & !no time` |
|
||||
| Tasks | `!p3 & (no date \| today \| overdue) & (p1 \| (p2 & !#Work) \| !(#Daily Routine \| #Work Routine \| #Chores \| #Camano Chores \| #Work \| ##Culture \| #Camano Info)) & !subtask` |
|
||||
| Work Tasks | `#Work & !p3 & (no date \| today \| overdue) & !subtask` |
|
||||
| Chores | `(today \| overdue \| no date) & (#Chores \| #Camano Chores)` |
|
||||
| On Deck | `p3 & (no date \| overdue \| today)` |
|
||||
|
||||
These define both the **agenda slices** heph must offer ([[tech-spec]] §8.2) and, by what "Tasks" *excludes* (`##Culture` = Movies/Books/Theater; `#Camano Info`), which contexts are **not tasks at all**.
|
||||
|
||||
**Reference contexts → wiki, not tasks (decided 2026-06).** The `##Culture` subtree (Movies/Books/Theater) and `#Camano Info` are reference lists (films to watch, books to read, contractor phone numbers), deliberately excluded from every task filter. In heph they belong as **`doc` pages**, not committed tasks — otherwise they flood "what is next?". On the initial Todoist import these 5 projects (~59 items) were reclassified into one wiki list-doc each and the task/project nodes tombstoned. (A useful general principle: a "task" that never appears in any of your filters is probably a note.)
|
||||
|
||||
**Future direction (noted 2026-06, not scheduled):**
|
||||
|
||||
- **Chores as a first-class feature.** Chores want **different do-date / recurrence semantics** from regular tasks (the every-N-days "do it again sometime after" rhythm, tuned-down urgency). Rather than model them as a `#Chores` *project* you scope to, make "chore" a **first-class task property** (kind/flag) with its own scheduling rules — which retires the `#Chores` / `#Camano Chores` projects (and the Camano split) entirely. The interim `Chores` filter view ([[tech-spec]] §8.2) is project-scoped until then.
|
||||
- **Drop the `Schedule` filter.** Schedule was Todoist's timed-routine view (`!no time`); heph's `do_date` is date-grained, so it is **omitted** (not approximated). It's entangled with the chores rework (timed routines), so reconsider both together if/when time-of-day lands on tasks.
|
||||
|
||||
### 6.3 Two kinds of task: commitments vs. context items
|
||||
|
||||
> 🔒 **DECIDED (shape).** A **commitment axis** orthogonal to the §6.2 attention-states.
|
||||
|
|
|
|||
|
|
@ -253,10 +253,45 @@ Replaces obsidian.nvim. Telescope-backed. **Primarily the context / knowledge-ba
|
|||
|
||||
- **Crate `crates/heph-tui`** — `ratatui` + `crossterm`, a **thin client of the daemon unix socket** (reuse `hephd::Client`); never touches SQLite, same as nvim.
|
||||
- **Layout** — three panes: **projects/contexts** (the §6.2.1 hierarchy) · **task list** (`next`/`list` rows with attention + human do/late) · **preview** (canonical-context doc body / `log.tail`).
|
||||
- **Gestures** — `j/k` move · `a` add · `x` done · `space` skip · `A` cycle attention · `e` reschedule (do/late) · `b` push-to-blue · saved filters for the **daily rituals** (Top of Mind, On-Deck review, per-project) — the [[design]] §6.2 "filters = saved views" made interactive.
|
||||
- **Gestures** — `j/k` move · `a` add · `x` done · `space` skip · `A` cycle attention · `e` reschedule (do/late) · `b` push-to-blue · the left pane lists the **§8.2 named filter views** (Top of Mind, Tasks, Work Tasks, Chores, On Deck) — the [[design]] §6.2 "filters = saved views" made interactive.
|
||||
- **TUI ↔ nvim handoff** — `o`/`<CR>` launches `$EDITOR` (nvim) on the task's canonical-context doc (`nvim` with a `+lua` call opening `heph://node/<ctx-id>`, or a temp `.md` round-tripped through `node.update`); a nvim command (e.g. `:Heph agenda`) shells back to the TUI.
|
||||
- **Testing** — TDD against a real daemon; headless smoke via `ratatui`'s `TestBackend`.
|
||||
- **Prereqs** (surface-agnostic, landing first): the CLI-complete task surface (human dates, `list`/state/`edit`, recurrence) and `task.set_schedule` (reschedule) — both in the current slice.
|
||||
- **Prereqs** (land first): **§8.2 filter views** (the TUI's saved-filter pane is just those views); the CLI-complete task surface and `task.set_schedule` (done).
|
||||
|
||||
## 8.2 Filter views (saved agenda slices) — planned, the next slice
|
||||
|
||||
> **Status: planned, the next slice.** [[design]] §6.2 / §6.2.1 establish that the owner navigates work through a fixed set of **saved filters**, not one flat list — so `next` alone is too coarse. This slice makes those filters first-class, shared by the CLI now and the TUI (§8.1) next. (The reference-context noise those filters excluded — `##Culture`, `#Camano Info` — has already been reclassified out of tasks into wiki docs, [[design]] §6.2.1.)
|
||||
|
||||
**The five built-in views** (the owner's sixth Todoist filter, **Schedule**, is intentionally dropped — see below), each derived from the verbatim Todoist query ([[design]] §6.2.1) and realized in heph terms (attention: p1→red, p2→orange, p4→white, p3→blue):
|
||||
|
||||
| View | Todoist query (origin) | heph realization |
|
||||
|---|---|---|
|
||||
| **Top of Mind** | `(p1\|p2) & (no date\|today\|overdue)` | `attention ∈ {red,orange}` ∧ actionable |
|
||||
| **On Deck** | `p3 & (no date\|overdue\|today)` | `attention = blue` ∧ actionable |
|
||||
| **Chores** | `(today\|overdue\|no date) & (#Chores\|#Camano Chores)` | scope ∈ {Chores, Camano Chores} ∧ actionable |
|
||||
| **Work Tasks** | `#Work & !p3 & (…) & !subtask` | scope = Work subtree ∧ `attention ≠ blue` ∧ actionable |
|
||||
| **Tasks** | `!p3 & (…) & !(#Daily Routine\|#Work Routine\|#Chores\|#Camano Chores\|#Work\|##Culture\|#Camano Info) & !subtask` | `attention ≠ blue` ∧ actionable ∧ **not in** the routine/work/chore projects |
|
||||
|
||||
**Engine work — extend `list` (§6) so a view is a *predicate expressed as data*** (mirroring §7's "order as data"):
|
||||
|
||||
- `attention`: a **set** of states (was a single value) — e.g. `{red,orange}`.
|
||||
- `scope`: a project **including its descendant projects** (subtree, for `##Culture` / Work-tree), and/or **multiple** projects (Chores + Camano Chores).
|
||||
- `exclude_projects`: a list subtracted from the result (the "Tasks" leftover view).
|
||||
- `actionable`: a bool toggle applying the §7 do-date candidacy gate inside `list` (today the gate is `next`-only).
|
||||
- (`recurring`: optional filter for the `Schedule` approximation.)
|
||||
|
||||
Project-subtree resolution needs the **parent-project links** ([[design]] §6.2.1) — a small `links`/query addition. `!subtask` is largely implicit (heph `list`/`next` return committed tasks, not context items).
|
||||
|
||||
**Surface:**
|
||||
- **CLI:** `heph view <name>` (`tom|tasks|work|chores|ondeck`) prints the slice using the same row format as `next`/`list`. A `heph view` with no name lists the available views.
|
||||
- **TUI (§8.1):** the same views power the left filter pane.
|
||||
- **nvim:** may later expose them (`:Heph view <name>`) — navigation, not required for this slice.
|
||||
|
||||
**Defaults vs. custom:** the five ship as **built-in named views** seeded from the queries above. **User-defined filters** (a small config-driven view list, eventually a query DSL) are a later extension — deliberately deferred to avoid building a Todoist-query-language parser now.
|
||||
|
||||
**Schedule view dropped (decided 2026-06).** `Schedule`'s `!no time` selects items with a *time-of-day*, which heph's **date-grained** `do_date` can't represent; rather than ship a misleading approximation it is **omitted for now**. It is entangled with the chores rework below (timed routines), so revisit both together if/when time-of-day lands on tasks.
|
||||
|
||||
> **Future — chores as a first-class feature (noted, not scheduled).** The `Chores` view here is an interim project-scoped filter. The intent is to make **chores a first-class concept** with their own **do-date / recurrence semantics** (distinct from regular tasks), retiring the `#Chores` / `#Camano Chores` *projects* (and the Camano split) entirely — chores would be a task flag/kind, not a project you scope to. When that lands, the `Chores` view becomes "tasks where `is_chore`," and `Schedule` (timed routines) is reconsidered alongside it. See [[design]] §6.2.1.
|
||||
|
||||
## 9. Testing strategy (TDD, layered)
|
||||
|
||||
|
|
@ -374,12 +409,12 @@ See [[design]] §5–§7 for the constraints later phases impose on present choi
|
|||
|
||||
**Not yet done (resume order)**
|
||||
|
||||
> The Rust backend is feature-complete; `heph.nvim` slices 11a–11c + a UX iteration are done. **Surface strategy revised 2026-06 to a three-surface model** ([[design]] §4 / §6.2.1, grounded in a study of the owner's live Todoist): **CLI = capture/scripting + complete API**, **TUI = primary task agenda/triage** (to build), **nvim = context/KB**. Remaining work is reordered accordingly.
|
||||
> The Rust backend is feature-complete; the **CLI is the complete API + task driver**, the **daemon runs as an OS service** (`heph daemon`; all surfaces connect-only), and the live store has been seeded from Todoist with reference contexts reclassified to wiki docs ([[design]] §6.2.1). **Surface strategy = three-surface model** ([[design]] §4): **CLI = capture/scripting + complete API** (done), **TUI = primary task agenda/triage** (to build), **nvim = context/KB**. Remaining work, in order:
|
||||
|
||||
1. ⏳ **CLI-complete task surface (§1, §6, §7) — IN PROGRESS (this slice):** make `heph` implement the **entire daemon API** with ergonomic task management — human date parse+display (`tomorrow`/`+3d`/`fri`/ISO), recurrence presets + easy NL subset, `list`, `done`/`drop`/`skip`, `attention`, **`edit`** (new backend **`task.set_schedule`** — the missing *reschedule* capability), `promote`, `health`, `log`, project-by-name, links/backlinks, sync, conflicts. (Replaces the old "task-scheduling UX in nvim" item — structured-field entry belongs on the CLI/TUI, not nvim buffers; [[design]] §4.)
|
||||
2. ⏳ **`heph-tui` — the task agenda/triage surface (§8.1) — the next big build:** ratatui terminal UI over the daemon socket; projects/list/preview panes; daily-ritual filters (orange reconfirm, blue review); launches into nvim for context and back. Planned in §8.1.
|
||||
1. ⏳ **Filter views (§8.2) — the next slice:** make the owner's saved filters (Top of Mind / Tasks / Work Tasks / Chores / On Deck — **Schedule dropped**, §8.2) first-class so the agenda isn't one flat list. Extend `list` (§6) to a data-expressed predicate — **attention set**, **project-subtree / multi scope**, **exclude-projects**, **actionable toggle** (+ parent-project link resolution) — and surface five built-in views via `heph view <name>` (the TUI reuses them). Seeded from the verbatim Todoist queries ([[design]] §6.2.1). *(Future, noted: chores become a first-class kind with their own do-date/recurrence semantics, retiring the Chores/Camano-Chores projects — §8.2.)*
|
||||
2. ⏳ **`heph-tui` — the task agenda/triage surface (§8.1) — the next big build:** ratatui terminal UI over the daemon socket; projects/list/preview panes; the §8.2 filter views as the saved-filter pane; launches into nvim for context and back. **Depends on the filter-views slice.**
|
||||
3. ⏳ **nvim task-navigation polish (§8) — small:** show do/late in `next`/`list` rows and a clean jump-to-context gesture (read/navigate, not field-edit).
|
||||
4. ⏳ **Tags + project-hierarchy depth (§4, §6.2.1) — deferred:** tags are barely used (5/387) so low priority; project hierarchy beyond `project add --parent` (hierarchy-aware `scope`, `project list` needing a list-by-kind RPC) is a refinement.
|
||||
4. ⏳ **Tags + project-hierarchy depth (§4, §6.2.1) — deferred:** tags are barely used (5/387) so low priority; project hierarchy beyond `project add --parent` (and the subtree `scope` the filter-views slice introduces) is a refinement.
|
||||
5. ⏳ **`heph.nvim` slice 11d (§6/§8) — DEFERRED, post-parity:** daemon **server-push** notification framing (no-`id` lines on the socket; the client read-loop already demuxes them) + the **dirty-buffer reconcile** (the §8 "known-hard" case) + the "update-arrives-while-open" e2e (§9).
|
||||
6. ⏳ **Split `heph.nvim` to its own forge repo (§8) — UX polish:** generated from this monorepo (subtree-split in CI) so the lazy spec becomes `{ "eblume/heph.nvim" }` instead of a local-clone `dir` (see [[install-heph]]).
|
||||
7. ⏳ **Adoption refinement + multi-tenant (§13) — non-blocking:** local→authed **adoption** currently rewrites `owner_id` (`adopt_owner`) but not yet the owner-embedded deterministic ids (journal/tag) + their links; and the hub is single-tenant (one owner per store) — owner-per-token storage is a future extension.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue